使用正则表达式使XHTML文件有效

时间:2011-02-15 07:50:06

标签: php xml regex xhtml simplexml

我正在尝试使用PHP和SimpleXML来解析XHTML文件,但该文件包含<和>标记不是标记的一部分并导致解析失败(打开和结束标记不匹配)。

如何在解析之前将这些转换为HTML实体而不更改文件或影响标记?

示例:

<p> a < b </p>

会变成:

<p> a &lt; <b> </p>

2 个答案:

答案 0 :(得分:2)

简而言之,答案是:你不能用正则表达式解析html。

也许您可以尝试使用另一个不会阻塞<>的xml解析器?

更好的是,不要尝试将xhtml文件解析为xml,因为正如您已经指出的那样,它实际上不是一个xml文件,并且其中包含非法字符。

答案 1 :(得分:1)

正如Martin Jespersen已经说过的,用正则表达式解析(无效或有效)标记是没有好办法的,至少不是用PHP正则表达式。

那就是说, if 你只想找到一种方法来删除

  • 不平衡的尖括号
  • 介于有效标记之间
  • 在其属性值
  • 中的某处不包含尖括号

然后你可能会这样做:

$intermediate = preg_replace('/(>[^<>]*)<([^<>]*<)/', '\1&lt;\2', $subject);
$result = preg_replace('/(>[^<>]*)>([^<>]*<)/', '\1&gt;\2', $intermediate);

但是你必须多次运行,直到没有更多的匹配,因为这样一次只会在标签之间捕获一个迷路<>。它也会在<p> a <> b </p>等伪平衡括号上失败。