Мне нужно регулярное выражение php, которое заменяет один тег другим - PullRequest
1 голос
/ 25 февраля 2009

Вот что мне нужно сделать:

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

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

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

<u>text sample</u>

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

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

Ответы [ 4 ]

5 голосов
/ 25 февраля 2009

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

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

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

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

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

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

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

Использовать DomDocument :: LoadFromHTML;)

5 голосов
/ 25 февраля 2009

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

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

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

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


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

Посмотрите на DOMDocument-> loadHTML () и связанные функции .

0 голосов
/ 25 февраля 2009

Для основного примера, который вы дали.

<?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' в конец шаблона $, чтобы сделать его нечувствительным к регистру.

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

0 голосов
/ 25 февраля 2009

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

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

...