Мне нужно регулярное выражение php, которое заменяет один тег другим

Вот что мне нужно для этого:

Мне нужно сопоставить следующий тег:

<SPAN style="TEXT-DECORATION: underline">text sample</SPAN>

Мне нужно заменить диапазон тегом, совместимым с html3, но оставьте текст между ними. Последний тег после замены должен выглядеть так:

<u>text sample</u>

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

Заранее спасибо.

Ответов (4)

Решение

Регулярные выражения не предназначены для манипулирования тегами.

Если у вас есть какая-либо форма вложения, она становится беспорядочной.

Однако, учитывая очень простой пример, вы, возможно, могли бы сделать это:

$MyString = preg_replace
    ( '/(?si)<SPAN\s+style\s*=\s*"TEXT-DECORATION:\s*underline;?"\s*>(.*?)<\/SPAN>/'
    , '<u>$1</u>'
    , $MyString
    );


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

Взгляните на DOMDocument-> loadHTML () и связанные с ним функции .

Вам понадобится несколько таких строк:

preg_replace('|<SPAN style="TEXT-DECORATION: underline">(.+?)</SPAN>|', '<u>$1</u>', $text);
preg_replace('|<SPAN style="FONT-WEIGHT: bold">(.+?)</SPAN>|', '<b>$1</b>', $text);
preg_replace('|<SPAN style="FONT-STYLE: italic">(.+?)</SPAN>|', '<i>$1</i>', $text);

и т. д. Хотя если есть вероятность, что теги не будут точно соответствовать этим регулярным выражениям (что обычно имеет место, за исключением очень простого сгенерированного машиной HTML), выполнение этого с регулярными выражениями становится чертовски сложным, и вам будет лучше выключить с помощью какого-то парсера.

Для базового примера, который вы привели.

<?php 
$string = '<SPAN style="TEXT-DECORATION: underline">text sample</SPAN>';
$pattern = '/<SPAN style=\"TEXT-DECORATION: underline\">(.+?)<\/SPAN>/';
$replacement = '<u>$1</u>'
echo preg_replace($pattern,$replacement,$string);
?>

сделает свое дело. Регулярное выражение шаблона довольно просто - это именно то, что вы ищете (с кавычками и экранированием '/') с помощью (. +?), Который говорит, что нужно включать все возможные символы до закрытия тега SPAN. Это предполагает, что ваш код отформатирован последовательно, вы можете добавить «i» в конец шаблона $, чтобы сделать его нечувствительным к регистру.

Обратите внимание, что это не совсем правильный способ сделать это.

НЕ ИСПОЛЬЗУЙТЕ ОБЫЧНЫЕ ВЫРАЖЕНИЯ ДЛЯ РАЗБОРА HTML

не используйте регулярные выражения для синтаксического анализа HTML

не используйте регулярные выражения для синтаксического анализа HTML

не используйте регулярные выражения для синтаксического анализа HTML

не используйте регулярные выражения для синтаксического анализа HTML

не используйте регулярные выражения для синтаксического анализа HTML

вам нужно больше разъяснений?

Используйте DomDocument :: LoadFromHTML;)