正则表达式:将文本放在<p>内</p> <p> </p>

时间:2010-08-12 12:15:49

标签: regex html-parsing

我有一些破解的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 个答案:

答案 0 :(得分:3)

不,这对正则表达式来说通常是一个坏主意。正则表达式不进行有状态解析。 HTML具有隐式标记,需要保持状态解析。

HTML通常有很多怪癖。编写HTML解析器很困难,因为您不仅要记录事情应该如何,还要考虑到在野外看到的破坏行为。

正则表达式是此作业的错误工具。

答案 1 :(得分:1)

可以http://htmlpurifier.org/帮助你吗?

答案 2 :(得分:1)

虽然正则表达式不是这类工作的最佳解决方案,但此代码适用于您提供的示例(可能不是最佳的!)

<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';

但请注意,它可能会弄乱,因为结束标记可以匹配不同的东西。