Эта тема на forum.dklab.ru


Lektor: Регулярные выражения. Вложенные конструкции.
Ребята, нужна помощь в работе с рекуррентными структурами т.е. когда нужно учитывать вложенность элементов при замене. Одними регулярками тут не обойтись, помогите с алгоритмом (или примером :) ).

Например:

<span style="color: red;">цветной текст <span style="font-size: 16px;">большой текст</span>цветной текст</span>


нужно преобразовать в такую конструкцию:

[color=red]цветной текст [size=16]большой текст[/size]цветной текст[/color]


для меня проблема в том что закрывающий тег"</span>" одинаков для двух(3,4,5) дургих тегов.
Миша Спларов:
http://ru.php.net/manual/en/regexp.reference.php#regexp.reference.repetition
Lektor:
полезная ссылка.. я правда читал в переводе на русс, плюс по регуляркам читал книгу Дмитрия Котерова, Алексей Костарев "PHP5 В подлиннике" 2005г. там как раз и писалось про рекуррентные структуры, что логику проверки вложенности нужно писать на пхп ... т.к. одними регулярками не обойтись .. там это рассматривалось на примере:

<?php ## Сравнение "жадных" и "ленивых" квантификаторов.
$str = '[b]жирный текст [b]а тут - еще жирнее[/b] вернулись[/b]';
$to = '<b>$1</b>';
$re1 = '|\[b\] (.*) \[/b\]|ixs';
$re2 = '|\[b\] (.*?) \[/b\]|ixs';
$result = preg_replace($re1, $to, $str);
echo "Жадная версия: ".htmlspecialchars($result)."<br>";
$result = preg_replace($re2, $to, $str);
echo "Ленивая версия: ".htmlspecialchars($result)."<br>";
?>

и результат

жадная версия: <b>Жирный текст [b]а тут еще жирней [/b] вернулись </b>
ленивая версия: <b>Жирный текст [b]а тут еще жирней </b> вернулись [/b]


Думал кто поможет с алгоритмом как вести учет вложенности.
Миша Спларов:
Вас никто не понимает. О какой вложенности вы говорите? У вас в примере ничего подобного нету.
Простейший поиск/замена с минимальным квантификатором, который описывается по приведённой ссылке. Или что-то другое имеется ввиду?
dimagolov:
Миша Спларов, у него одинаковые закрывающие HTML теги при разных атрибутах открывающего должны замениться на разные закрывающие BB коды.

Вообще-то я не понял для чего вообще нужна такая задача. Всегда надо обратное, преобразовывать BB в HTML для хранения "отображаемой" версии, но при этом "редактируемая" обязана тоже храниться. Если ТС ее не хранит, и из-за этого у него возникла вышеизложенная задача, то он ССЗБ.
Lektor:

$text="<span style=\"color: red;\">this is first<span style=\"font-size: 26px;\"> this is second </span>first</span>";
while (preg_match("#<span style=\"((?:[^>]*?)):\s((?:[^>]*?));\">(((?!<span ).)*?)</span>#sie", $text, $match))
{
$search = "#".preg_quote($match[0])."#si";
$replace = "[".$match[1]."=".$match[2]."]".$match[3]."[/".$match[1]."]";
$text = preg_replace($search, $replace, $text);

}
$text = preg_replace("#\[font-size=(\d+)px\](.*?)\[/font-size\]#si", "[size=\\1]\\2[/size]", $text);

echo $text;


фух .. ) осилил (точнее идею на xpoint-е увидел и сделал по аналогии).

Эта тема на forum.dklab.ru