Master-X
Регистрация
|
Вход
Форум
|
Новости
|
Статьи
Главная
»
Форум
»
Программинг, Скрипты, Софт, Сервисы
»
Тема:
Дзен Мастера регулярных выражений есть на форуме?
Новая тема
Ответить
цитата
07/07/09 в 18:37
cyberxxx
Нужна регулярка, выравнивающая по заданному краю/центру все параграфы (<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>
Одним выражением. Кто осилит?
цитата
07/07/09 в 21:09
Yacc
Чуток поправил.
Код:
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 раз
цитата
07/07/09 в 21:54
Cynic
Код:
$variable =~ s/<p([^>].*?)(?:align="[^"]{1,10}"){0,1}([^>]*?)>(.*?<img.*?)<\/p>/<p$1 align="center" $2>$3<\/p>/gi;
цитата
07/07/09 в 21:54
cyberxxx
Брр
А через
preg_replace()
можно?
З.Ы. На каком языке вы вообще это написали-то? Чувствую себя инопланетянином
цитата
08/07/09 в 14:29
freeek
Код:
$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" и вопрос о переводе строк, так как в таком виде коректно обрабатывает однострочный текст
цитата
08/07/09 в 14:45
cyberxxx
А почему только в строку (если там по ходу дела попадается "\n" то работать не будет)? И как быть если align уже задан и его нужно перебороть?
Как я понимаю, у Cynic-а оно как раз по уму сделано. Вот только бы перевести его код на русский язык
З.Ы. Перевелилсь настоящие мастера на мастере?
цитата
09/07/09 в 11:54
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);
Цитата:
А почему только в строку (если там по ходу дела попадается "\n" то работать не будет)?
потому что рега будет искатьименно то что ею задали, изначально мы не можем знать где будет перевод строки
конечно, в таком случае юзают модификатор
Код:
m (PCRE_MULTILINE)
но че то у меня он не сработал, поэтому не стал заморачиваться разбором, а просто удалил все переводы строк
Цитата:
И как быть если align уже задан и его нужно перебороть?
теперь все перебарывается
цитата
09/07/09 в 13:49
cyberxxx
Неа, не работает твой код. Проверь на простейшем примере:
Код:
echo align('<p><img src="1.jpg"></p>', "center");
freeek писал:
конечно, в таком случае юзают модификатор
Код:
m (PCRE_MULTILINE)
но че то у меня он не сработал, поэтому не стал заморачиваться разбором, а просто удалил все переводы строк
Описание говорит, что "в случае, если обрабатываемый текст не содержит символов перевода строки, либо шаблон не содержит метасимволов '^' или '$',
данный модификатор не имеет никакого эффекта.
". Вот по этой причине и не сработал.
Тем не менее, лично я в регулярках разбираюсь очень плохо. Потому и обратился к местным Гуру.
цитата
09/07/09 в 14:26
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);
цитата
09/07/09 в 16:14
cyberxxx
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>
Позволь спросить, в чем именно заключается работа твоего скрипта?
цитата
09/07/09 в 18:47
freeek
последний пример работает коректно, где
Код:
%\<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, которое мы передали функции
цитата
09/07/09 в 19:14
cyberxxx
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>
цитата
09/07/09 в 19:15
cyberxxx
Я буду очень удивлен, если ты получишь другой результат. Может быть у меня какой-то другой PHP просто
Как говорилось в самом первом посте, код должен правильно обрабватывать разные варианты, например:
Код:
<p><img src="1.jpg"></p>
и
Код:
<p align="left"><img src="1.jpg"></p>
цитата
10/07/09 в 01:27
freeek
как говорится х.з.
надо посмотреть, я, конечно не гуру пхп, но тут единственная проблема может быть с "жадностью", хотя мне так кажется тоже самое можно б было сделать на JQuery, по крайней мере попробовать, на вскидку, одна строчка кода
Код:
<script src='jquery-1.3.2.js'></script>
<script>
function init()
{
$('img').parents('p').attr("align","center");
}
$(document).ready(init);
</script>
только нужна возможность подключить фрэймворк
по пхп, надо глянуть, я думаю решение есть, эта не такая уж сложная задача
цитата
10/07/09 в 12:20
cyberxxx
Ну судя по этому топику, она более чем сложная. По крайней мере для кодеров с этого форума.
З.Ы. JQuery мне, к сожалению, вообще никаким боком не подходит.
цитата
10/07/09 в 13:21
freeek
Код:
$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/07/09 в 13:38
cyberxxx
Вот пример Дзен Мастерства от админа
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;
}
?>
Тут, правда, не одна регулярка, а две, но главное, что все работает. Учитесь
цитата
10/07/09 в 13:45
freeek
да, хороший пример
на досуге рассмотрю, для самообразования
на взгляд смысл такой же что у меня, но более наворочено исполнение
Новая тема
Ответить
Эта страница в полной версии