Реклама на сайте Advertise with us

Дзен Мастера регулярных выражений есть на форуме?

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:

осинизатор

С нами с 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>

Одним выражением. Кто осилит?

ушел на завод

0
 



С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538


Передовик Master-X (01.11.2009) Передовик Master-X (16.11.2009) Передовик Master-X (01.02.2011) Передовик Master-X (01.12.2011) Передовик Master-X (16.12.2011) Ветеран трепа Master-X (01.01.2014)
Ссылка на сообщениеДобавлено: 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 раз

6
 



С нами с 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;

6
 

осинизатор

С нами с 10.03.03
Сообщения: 8491
Рейтинг: 819

Ссылка на сообщениеДобавлено: 07/07/09 в 21:54       Ответить с цитатойцитата 

Брр icon_smile.gif А через preg_replace() можно?

З.Ы. На каком языке вы вообще это написали-то? Чувствую себя инопланетянином icon_smile.gif

ушел на завод

0
 



С нами с 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" и вопрос о переводе строк, так как в таком виде коректно обрабатывает однострочный текст

2
 

осинизатор

С нами с 10.03.03
Сообщения: 8491
Рейтинг: 819

Ссылка на сообщениеДобавлено: 08/07/09 в 14:45       Ответить с цитатойцитата 

А почему только в строку (если там по ходу дела попадается "\n" то работать не будет)? И как быть если align уже задан и его нужно перебороть?

Как я понимаю, у Cynic-а оно как раз по уму сделано. Вот только бы перевести его код на русский язык icon_smile.gif

З.Ы. Перевелилсь настоящие мастера на мастере? icon_smile.gif

ушел на завод

0
 



С нами с 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" то работать не будет)?

потому что рега будет искатьименно то что ею задали, изначально мы не можем знать где будет перевод строки
конечно, в таком случае юзают модификатор
Код:
m (PCRE_MULTILINE)
но че то у меня он не сработал, поэтому не стал заморачиваться разбором, а просто удалил все переводы строк

Цитата:
И как быть если align уже задан и его нужно перебороть?

теперь все перебарывается

6
 

осинизатор

С нами с 10.03.03
Сообщения: 8491
Рейтинг: 819

Ссылка на сообщениеДобавлено: 09/07/09 в 13:49       Ответить с цитатойцитата 

Неа, не работает твой код. Проверь на простейшем примере:
Код:
echo align('<p><img src="1.jpg"></p>', "center");


freeek писал:
конечно, в таком случае юзают модификатор
Код:
m (PCRE_MULTILINE)
но че то у меня он не сработал, поэтому не стал заморачиваться разбором, а просто удалил все переводы строк

Описание говорит, что "в случае, если обрабатываемый текст не содержит символов перевода строки, либо шаблон не содержит метасимволов '^' или '$', данный модификатор не имеет никакого эффекта.". Вот по этой причине и не сработал.

Тем не менее, лично я в регулярках разбираюсь очень плохо. Потому и обратился к местным Гуру.

ушел на завод

0
 



С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134

Ссылка на сообщениеДобавлено: 09/07/09 в 14:26       Ответить с цитатойцитата 

все работает smail101.gif

Код:
$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);

-3
 

осинизатор

С нами с 10.03.03
Сообщения: 8491
Рейтинг: 819

Ссылка на сообщениеДобавлено: 09/07/09 в 16:14       Ответить с цитатойцитата 

freeek писал:
все работает smail101.gif
Код:
$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>

Позволь спросить, в чем именно заключается работа твоего скрипта?

ушел на завод

0
 



С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134

Ссылка на сообщениеДобавлено: 09/07/09 в 18:47       Ответить с цитатойцитата 

последний пример работает коректно, где
Код:
%\<p\s*
, а с
Код:
%\<p\s+
работать не будет, так как это вариант предусматривает наличе хотя бы одного пробела после
Код:
<p


Код:
<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, которое мы передали функции

0
 

осинизатор

С нами с 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>

ушел на завод

0
 

осинизатор

С нами с 10.03.03
Сообщения: 8491
Рейтинг: 819

Ссылка на сообщениеДобавлено: 09/07/09 в 19:15       Ответить с цитатойцитата 

Я буду очень удивлен, если ты получишь другой результат. Может быть у меня какой-то другой PHP просто icon_wink.gif

Как говорилось в самом первом посте, код должен правильно обрабватывать разные варианты, например:
Код:
<p><img src="1.jpg"></p>

и
Код:
<p align="left"><img src="1.jpg"></p>

ушел на завод

0
 



С нами с 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>


только нужна возможность подключить фрэймворк
по пхп, надо глянуть, я думаю решение есть, эта не такая уж сложная задача

0
 

осинизатор

С нами с 10.03.03
Сообщения: 8491
Рейтинг: 819

Ссылка на сообщениеДобавлено: 10/07/09 в 12:20       Ответить с цитатойцитата 

Ну судя по этому топику, она более чем сложная. По крайней мере для кодеров с этого форума.

З.Ы. JQuery мне, к сожалению, вообще никаким боком не подходит.

ушел на завод

0
 



С нами с 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>


нее, все таки не сложная icon_smile.gif

6
 

осинизатор

С нами с 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;
}
?>

Тут, правда, не одна регулярка, а две, но главное, что все работает. Учитесь icon_cool.gif

ушел на завод

0
 



С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134

Ссылка на сообщениеДобавлено: 10/07/09 в 13:45       Ответить с цитатойцитата 

да, хороший пример
на досуге рассмотрю, для самообразования
на взгляд смысл такой же что у меня, но более наворочено исполнение

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »