@2slide

Какая есть регулярка для замены тега code на pre code?

В примере тег code заменён src.
есть задача найти все теги < src > ... < /src >
и заключить в < pre> < src class=''> ... < /src >< /pre>
у тега src может быть атрибут lang
регулярка
$sText = preg_replace("/<src * lang=(.*?)>(.*)<\/src\>/is", "<pre><src class=$1>$2</src></pre>", $sText);

Работает при одном блоке < src > ... < /src > делает < pre>< src class=''>..< /src>< /pre>
при нескольких делает так
< pre >
< src src class='' > ... < /src >
< src src class=''> ... < /src >
< /pre>

А нужно так
< pre >
< src src class='' > ... < /src >
< /pre>
< pre >
< src src class=''> ... < /src >
< /pre>

Сам решить задачу не смог. Спасибо.
  • Вопрос задан
  • 2627 просмотров
Решения вопроса 1
DeFacto
@DeFacto
$sText = preg_replace("#^<src lang=(.*?)>(.*?)</src>$#ism", "<pre><src class=$1>$2</src></pre>", $sText);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
egor_nullptr
@egor_nullptr
Есть замечательные классы для работы с XML, и не надо мучать регулярки.
$doc = new DomDocument('1.0', 'utf-8');
$doc->loadXml($text);
$xp = new DomXPath($doc);

foreach ($xp->query('//src') as $src_node) {
    $pre_node = $doc->createElement('pre');
    $pre_node->appendChild($src_node);
    $src_node->parentNode->replaceChild($pre_node, $src_node);
};

$new_text = $doc->saveXML();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы