регулярное выражение: поместить текст снаружи <p>внутри <p> - PullRequest
0 голосов
/ 12 августа 2010

У меня есть неработающий html-код, который я хотел бы исправить с помощью регулярных выражений.

html может выглядеть примерно так:

<p>text1</p>
<p>text2</p>
text3
<p>text4</p>
<p>text5</p>

Но может быть гораздо больше абзацев ии другие html-элементы.

Я хочу включить в:

<p>text1</p>
<p>text2</p>
<p>text3</p>
<p>text4</p>
<p>text5</p>

Возможно ли это с помощью регулярного выражения?Я использую php, если это имеет значение.

Ответы [ 3 ]

3 голосов
/ 12 августа 2010

Нет, это вообще плохая идея с регулярными выражениями.Регулярные выражения не выполняют синтаксический анализ состояния.HTML имеет неявные теги и требует сохранения состояния для анализа.

HTML обычно имеет множество особенностей.Сложно написать HTML-парсер, поскольку вы должны не только следить за тем, как все должно быть, но и учитывать нарушенное поведение, наблюдаемое в дикой природе.

Регулярные выражения - неправильный инструмент для этой работы.

1 голос
/ 12 августа 2010

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

<php>

$text = '<p>text1</p>
<p>text2</p>
text3
<p>text4</p>
<p>text5</p>';

$regex = '|(([\r\n ]*<p>[a-zA-Z0-9 \r\n]+</p>[\r\n ]*)+)([\r\n ]*[a-zA-Z0-9 ]+)(([\r\n ]*<p>[a-zA-Z0-9 \r\n]+</p>[\r\n ]*)+)|i';
$replacement = '${1}<p>${3}</p>${4}';
$replacedText =  preg_replace($regex, $replacement, $text);

echo $replacedText;
</php>

в строке замены, смотрите, что вы используетесоответствуйте 1, 3 и 4, чтобы получить правильные подспички!Если вы хотите иметь возможность захватывать другие теги HTML, тогда

, вы можете использовать это регулярное выражение:

$regex = '|(([\r\n ]*<[a-z0-6]+>[a-zA-Z0-9 \r\n]+</[a-z0-6]+>[\r\n ]*)+)([\r\n ]*[a-zA-Z0-9 ]+)(([\r\n ]*<[a-z0-6]+>[a-zA-Z0-9 \r\n]+</[a-z0-6]+>[\r\n ]*)+)|i';

, но имейте в виду, что это может испортить вещи, потому что закрывающий тег может соответствовать чему-то другому.

1 голос
/ 12 августа 2010

Может ли http://htmlpurifier.org/ помочь вам?

...