осинизатор
С нами с 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 |
да, хороший пример
на досуге рассмотрю, для самообразования
на взгляд смысл такой же что у меня, но более наворочено исполнение
|
|
|
|