我有一些破解的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。
答案 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';
但请注意,它可能会弄乱,因为结束标记可以匹配不同的东西。