| осинизатор
 
 С нами с 10.03.03
 Сообщения: 8491
 Рейтинг: 819
 
 
   | 
								
									|  Добавлено: 07/07/09 в 18:37 |  
 
							Нужна регулярка, выравнивающая по заданному краю/центру все параграфы (<p...>...</p>), содержащие картинку/картинки (...<img...>...)
 
Например, в случае, если мы хотим отровнять картинки по центру, это:
   | Код: |   | bla bla bla <p class="xxx"><a href="http://www.cnn.com"><img src="image1.jpg"><br>description</a></p>
 <p>bla bla bla</p>
 <p align="left" id="yyy"><img src="image2.jpg"></p>
 <p align="right">bla bla bla</p>
 
 | 
 
должно превратиться вот в это:
   | Код: |   | bla bla bla <p align="center" class="xxx"><a href="http://www.cnn.com"><img src="image1.jpg"><br>description</a></p>
 <p>bla bla bla</p>
 <p align="center" id="yyy"><img src="image2.jpg"></p>
 <p align="right">bla bla bla</p>
 
 | 
 
Одним выражением. Кто осилит? | 
					
						|  |  | 
					
						|  | 
					
						| 
 
 С нами с 09.03.09
 Сообщения: 6053
 Рейтинг: 3538
 
 
 
             
   | 
								
									|  Добавлено: 07/07/09 в 21:09 |  
 
							Чуток поправил.
   | Код: |   | function foo ([string]$html, [string]$align) {
 $html=[regex]::Replace($html,"align=\W\w*\W","")
 $patt=[regex]"(?<para>(<p\s.*?))(?<cont>(.*?>.*?<img.+?</p>))"
 $repl="`${para}align=""$($align)"" `${cont}"
 $patt.Replace($html,$repl)
 }
 | 
 
 Последний раз редактировалось: Yacc (07/07/09 в 21:57), всего редактировалось 1 раз
 | 
					
						|  |  | 
					
						|  | 
					
						| 
 
 С нами с 27.01.03
 Сообщения: 156
 Рейтинг: 187
 
 
   | 
								
									|  Добавлено: 07/07/09 в 21:54 |  
 
							  | Код: |   | $variable =~ s/<p([^>].*?)(?:align="[^"]{1,10}"){0,1}([^>]*?)>(.*?<img.*?)<\/p>/<p$1 align="center" $2>$3<\/p>/gi;
 | 
 | 
					
						|  |  | 
					
						|  | 
					
						| осинизатор
 
 С нами с 10.03.03
 Сообщения: 8491
 Рейтинг: 819
 
 
   | 
								
									|  Добавлено: 07/07/09 в 21:54 |  
 
							Брр    А через preg_replace()  можно?
 
З.Ы. На каком языке вы вообще это написали-то? Чувствую себя инопланетянином    | 
					
						|  |  | 
					
						|  | 
					
						| 
 
 С нами с 05.05.05
 Сообщения: 1913
 Рейтинг: 1134
 
 
   | 
								
									|  Добавлено: 08/07/09 в 14:29 |  
 
							  | Код: |   | $align = "center"; function align($string,$align)
 {
 $pattern = "%\<p\s+([^>]*)>(.*)?(\<img\s.*src\=[^>]+\>)+(.*)?\<\/p\>%iU";
 $replace = "<p align=\"".$align."\"$1>$2$3$4</p>";
 return preg_replace($pattern, $replace, $string);
 }
 echo  align($string,$align);
 | 
 
на скорую руку, некогда
 
требует доработки в плане "жадности", чтобы определить наличие "align" и вопрос о переводе строк, так как в таком виде коректно обрабатывает однострочный текст | 
					
						|  |  | 
					
						|  | 
					
						| осинизатор
 
 С нами с 10.03.03
 Сообщения: 8491
 Рейтинг: 819
 
 
   | 
								
									|  Добавлено: 08/07/09 в 14:45 |  
 
							А почему только в строку (если там по ходу дела попадается "\n" то работать не будет)? И как быть если align уже задан и его нужно перебороть?
 
Как я понимаю, у Cynic-а оно как раз по уму сделано. Вот только бы перевести его код на русский язык    
З.Ы. Перевелилсь настоящие мастера на мастере?    | 
					
						|  |  | 
					
						|  | 
					
						| 
 
 С нами с 05.05.05
 Сообщения: 1913
 Рейтинг: 1134
 
 
   | 
								
									|  Добавлено: 09/07/09 в 11:54 |  
 
							  | Код: |   | $align = "center"; function align($string,$align)
 {
 $string = preg_replace("%\r\n%","",$string);
 $pattern = "%\<p\s+(align=\"\w{1,10}\")*?([^>]*)>(.*)?(\<img[^>]+\>)+(.*)?\<\/p\>%iU";
 $replace = "<p align=\"".$align."\" $2>$3$4$5</p>";
 return preg_replace($pattern, $replace, $string);
 }
 echo  align($string,$align);
 | 
   | Цитата: |   | А почему только в строку (если там по ходу дела попадается "\n" то работать не будет)? | 
 
потому что рега будет искатьименно то что ею задали, изначально мы не можем знать где будет перевод строки
 
конечно, в таком случае юзают модификатор   но че то у меня он не сработал, поэтому не стал заморачиваться разбором, а просто удалил все переводы строк
   | Цитата: |   | И как быть если align уже задан и его нужно перебороть? | 
 
теперь все перебарывается | 
					
						|  |  | 
					
						|  | 
					
						| осинизатор
 
 С нами с 10.03.03
 Сообщения: 8491
 Рейтинг: 819
 
 
   | 
								
									|  Добавлено: 09/07/09 в 13:49 |  
 
							Неа, не работает твой код. Проверь на простейшем примере:
   | Код: |   | echo align('<p><img src="1.jpg"></p>', "center"); | 
   | freeek писал: |   | конечно, в таком случае юзают модификатор  но че то у меня он не сработал, поэтому не стал заморачиваться разбором, а просто удалил все переводы строк 
 | 
 
Описание говорит, что "в случае, если обрабатываемый текст не содержит символов перевода строки, либо шаблон не содержит метасимволов '^' или '$', данный модификатор не имеет никакого эффекта. ". Вот по этой причине и не сработал.
 
Тем не менее, лично я в регулярках разбираюсь очень плохо. Потому и обратился к местным Гуру. | 
					
						|  |  | 
					
						|  | 
					
						| 
 
 С нами с 05.05.05
 Сообщения: 1913
 Рейтинг: 1134
 
 
   | 
								
									|  Добавлено: 09/07/09 в 14:26 |  
 
							все работает      | Код: |   | $align = "center"; function align($string,$align)
 {
 $string = preg_replace("%\r\n%","",$string);
 $pattern = "%\<p\s*(align=\"\w{1,10}\")*?([^>]*)>(.*)?(\<img[^>]+\>)+(.*)?\<\/p\>%iU";
 $replace = "<p align=\"".$align."\" $2>$3$4$5</p>";
 return preg_replace($pattern, $replace, $string);
 }
 echo  align($string,$align);
 | 
 | 
					
						|  |  | 
					
						|  | 
					
						| осинизатор
 
 С нами с 10.03.03
 Сообщения: 8491
 Рейтинг: 819
 
 
   | 
								
									|  Добавлено: 09/07/09 в 16:14 |  
 
							  | freeek писал: |   | все работает   
   | Код: |   | $align = "center"; function align($string,$align)
 {
 $string = preg_replace("%\r\n%","",$string);
 $pattern = "%\<p\s*(align=\"\w{1,10}\")*?([^>]*)>(.*)?(\<img[^>]+\>)+(.*)?\<\/p\>%iU";
 $replace = "<p align=\"".$align."\" $2>$3$4$5</p>";
 return preg_replace($pattern, $replace, $string);
 }
 echo  align($string,$align);
 | 
 | 
 
Нет, не работает. Вот же пример:
   | Код: |   | <? function align($string,$align)
 {
 $string = preg_replace("%\r\n%","",$string);
 $pattern = "%\<p\s+(align=\"\w{1,10}\")*?([^>]*)>(.*)?(\<img[^>]+\>)+(.*)?\<\/p\>%iU";
 $replace = "<p align=\"".$align."\" $2>$3$4$5</p>";
 return preg_replace($pattern, $replace, $string);
 }
 echo align('<p><img src="1.jpg"></p>', "center");
 ?>
 | 
 
Результат:
   | Код: |   | <p><img src="1.jpg"></p> | 
 
Позволь спросить, в чем именно заключается работа твоего скрипта? | 
					
						|  |  | 
					
						|  | 
					
						| 
 
 С нами с 05.05.05
 Сообщения: 1913
 Рейтинг: 1134
 
 
   | 
								
									|  Добавлено: 09/07/09 в 18:47 |  
 
							последний пример работает коректно, где  , а с   работать не будет, так как это вариант предусматривает наличе хотя бы одного пробела после    | Код: |   | <p align="center" ><img src="1.jpg"></p> | 
 
вот результат
 
у меня все работает
   | Код: |   | $pattern = "%\<p\s*(align=\"\w{1,10}\")*?([^>]*)>(.*)?(\<img[^>]+\>)+(.*)?\<\/p\>%iU"; | 
 
эта рега должна работать полюбому
 
работа скрипта заключается в том, что:
 
1 - функция получается текс в перменной $string и значение align соответсвенно в $align
 
2 - из $string удаляются все переносы
 
3 - всеь параграфам которые содержат тэг img присваеваются новое значение align, которое мы передали функции | 
					
						|  |  | 
					
						|  | 
					
						| осинизатор
 
 С нами с 10.03.03
 Сообщения: 8491
 Рейтинг: 819
 
 
   | 
								
									|  Добавлено: 09/07/09 в 19:14 |  
 
							  | freeek писал: |   | у меня все работает 
   | Код: |   | $pattern = "%\<p\s*(align=\"\w{1,10}\")*?([^>]*)>(.*)?(\<img[^>]+\>)+(.*)?\<\/p\>%iU"; | 
 эта рега должна работать полюбому
 | 
 
Неа, не работает. Пример:
   | Код: |   | <? function align($string,$align)
 {
 $string = preg_replace("%\r\n%","",$string);
 $pattern = "%\<p\s*(align=\"\w{1,10}\")*?([^>]*)>(.*)?(\<img[^>]+\>)+(.*)?\<\/p\>%iU";
 $replace = "<p align=\"".$align."\" $2>$3$4$5</p>";
 return preg_replace($pattern, $replace, $string);
 }
 echo align('<p align="left"><img src="1.jpg"></p>', "center");
 ?>
 | 
 
Результат:
   | Код: |   | <p align="center"  align="left"><img src="1.jpg"></p> | 
 | 
					
						|  |  | 
					
						|  | 
					
						| осинизатор
 
 С нами с 10.03.03
 Сообщения: 8491
 Рейтинг: 819
 
 
   | 
								
									|  Добавлено: 09/07/09 в 19:15 |  
 
							Я буду очень удивлен, если ты получишь другой результат. Может быть у меня какой-то другой PHP просто    
Как говорилось в самом первом посте, код должен правильно обрабватывать разные варианты, например:
   | Код: |   | <p><img src="1.jpg"></p> | 
 
и
   | Код: |   | <p align="left"><img src="1.jpg"></p> | 
 | 
					
						|  |  | 
					
						|  | 
					
						| 
 
 С нами с 05.05.05
 Сообщения: 1913
 Рейтинг: 1134
 
 
   | 
								
									|  Добавлено: 10/07/09 в 01:27 |  
 
							как говорится х.з.
 
надо посмотреть, я, конечно не гуру пхп, но тут единственная проблема может быть с "жадностью", хотя мне так кажется тоже самое можно б было сделать на JQuery, по крайней мере попробовать, на вскидку, одна строчка кода
   | Код: |   | <script src='jquery-1.3.2.js'></script>
 <script>
 function init()
 {
 $('img').parents('p').attr("align","center");
 }
 $(document).ready(init);
 </script>
 
 | 
 
только нужна возможность подключить фрэймворк
 
по пхп, надо глянуть, я думаю решение есть, эта не такая уж сложная задача | 
					
						|  |  | 
					
						|  | 
					
						| осинизатор
 
 С нами с 10.03.03
 Сообщения: 8491
 Рейтинг: 819
 
 
   | 
								
									|  Добавлено: 10/07/09 в 12:20 |  
 
							Ну судя по этому топику, она более чем сложная. По крайней мере для кодеров с этого форума.
 З.Ы. JQuery мне, к сожалению, вообще никаким боком не подходит.
 | 
					
						|  |  | 
					
						|  | 
					
						| 
 
 С нами с 05.05.05
 Сообщения: 1913
 Рейтинг: 1134
 
 
   | 
								
									|  Добавлено: 10/07/09 в 13:21 |  
 
							  | Код: |   | $string = "bla bla bla <p class="xxx"><a href="http://www.cnn.com"><img src="image1.jpg"><br>description</a></p>
 <p>bla bla bla</p>
 <p align="left" id="yyy"><img src="image2.jpg"></p>
 <p align="right">bla bla bla</p>";
 $align = "right";
 function align($matches)
 {
 global $align;
 $matches[1] = preg_replace("%align=\W{1}\w+\W{1}%i","",$matches[1]);
 return  "<p align=\"".$align."\" ".$matches[1].">".$matches[2].$matches[3].$matches[4]."</p>";
 }
 echo preg_replace_callback("%\<p\s*([^>]*)?>(.*)?(\<img[^>]+\>)+(.*)?\<\/p\>%iU","align",$string);
 | 
 
результат
   | Код: |   | bla bla bla <p align="right"  class="xxx"><a href="http://www.cnn.com"><img src="image1.jpg"><br>description</a></p>
 <p>bla bla bla</p>
 <p align="right"   id="yyy"><img src="image2.jpg"></p>
 <p align="right">bla bla bla</p>
 | 
 
нее, все таки не сложная    | 
					
						|  |  | 
					
						|  | 
					
						| осинизатор
 
 С нами с 10.03.03
 Сообщения: 8491
 Рейтинг: 819
 
 
   | 
								
									|  Добавлено: 10/07/09 в 13:38 |  
 
							Вот пример Дзен Мастерства от админа Real-Bucks :
   | Код: |   | <? $html = 'bla bla bla
 <p class="xxx" id="yyy"><a href="http://www.cnn.com"><img src="image1.jpg"><br>description</a></p>
 <p>bla bla bla </p>
 <p align="left" id="zzz"><img src="image2.jpg"></p>
 <p align="right">bla bla bla</p>
 <p><img src="image3.jpg"></p> ';
 
 echo align('center',$html);
 
 function align($aln,$html) {
 $html = preg_replace("/<p([^>]*)>((?=\<.*img).*)<\/p>/siU","<p$1 align='$aln'>$2</p>",$html);
 $html = preg_replace("/(<p[^>]*)(align\=[\"\'](?!$aln)[^\"\']+[\"\'])([^>]*>(?=\<.*img).*<\/p>)/siU","$1$3",$html);
 return $html;
 }
 ?>
 | 
 
Тут, правда, не одна регулярка, а две, но главное, что все работает. Учитесь    | 
					
						|  |  | 
					
						|  | 
					
						| 
 
 С нами с 05.05.05
 Сообщения: 1913
 Рейтинг: 1134
 
 
   | 
								
									|  Добавлено: 10/07/09 в 13:45 |  
 
							да, хороший пример
на досуге рассмотрю, для самообразования
 на взгляд смысл такой же что у меня, но более наворочено исполнение
 | 
					
						|  |  | 
					
						|  |