使用php中的preg_match_all匹配标记内的标记

时间:2014-07-22 09:22:43

标签: php preg-match-all

我目前正致力于将HTML文档解析为数据库。我不允许从HTML文档中更改任何格式。在下面的示例中,我需要查找哪些标记具有类ID“Category”,然后获取此标记内的数据,在此示例中为“示例文本”。

如何让代码不仅匹配之后直接结束的标签?

$tags = "<p class=Category style='margin-left:0in;text-indent:0in'><a name='_
Toc390163149'></a><a name='_Ref388370252'></a><a
name='_Toc122858606'><span lang=EN-GB>3.<span style='font:7.0pt 'Times New 
Roman''>&nbsp;</span></span><span lang=EN-GB>Example Text</span></a></p>";

preg_match_all("/(<([\w]+)[^>]*>)(.*?)(<\/\\2>)/", $tags, $matches, PREG_SET_
        foreach ($matches as $val) {
            echo "matched: " . htmlspecialchars($val[0]) . "</br>";
            echo "part 1: " . htmlspecialchars($val[1]) . "</br>";
            echo "part 2: " . htmlspecialchars($val[2]) . "</br>";
            echo "part 3: " . htmlspecialchars($val[3]) . "</br>";
            echo "part 4: " . htmlspecialchars($val[4]) . "</br></br>";
        }

输出:

matched: <a name="_Toc390163149"></a>
part 1: <a name="_Toc390163149">
part 2: a
part 3:
part 4: </a>

matched: <a name="_Ref388370252"></a>
part 1: <a name="_Ref388370252">
part 2: a
part 3:
part 4: </

matched: <span lang=EN-GB>When not to follow Rules</span>
part 1: <span lang=EN-GB>
part 2: span
part 3: When not to follow Rules
part 4: </span>

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

简短的回答,您无法使用正则表达式解析复杂的数据格式,例如HTML,或者至少您不应该这样做。

很长的答案,PHP提供了许多用于解析HTML的库,与正则表达式解决方案相比,这些库既省力又容易出错。感兴趣的两个将是SimpleXML(如果您正在解析XHTML)和DOMDocument(如果您正在解析可能是也可能不是XML的标记)。我倾向于将后者用于HTML。

将标记加载到DOMDocument后,您可以使用XPath查询来查找所有p.category标记并迭代它们以获取其子节点和内容。