我使用php和regex在字符串中查找未关闭的html标签:
这是我的字符串:
$s="<div><h2>Hello world<h2><p>It's 7Am where I live<p><div>";
Run Code Online (Sandbox Code Playgroud)
您可以看到此处的所有标记均未关闭.
我想找到所有未关闭的标签,但问题是我的正则表达式也匹配开始标签.
到目前为止,这是我的正则表达式
/<[^>]+>/i
Run Code Online (Sandbox Code Playgroud)
这是我的preg_match_all()函数
preg_match_all("/<[^>]+>/i",$s,$v);
print_r($v);
Run Code Online (Sandbox Code Playgroud)
在正则表达式中我需要更改哪些内容才能匹配未关闭的标记?
<h2>
<p>
<div>
Run Code Online (Sandbox Code Playgroud)
Wik*_*żew 11
您可能不知道这一点,但DOMDocument可以帮助您修复HTML.
$html = "<div><h2>Hello world<h2><p>It's 7Am where I live<p><div>";
libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->loadHTML('<root>' . $html . '</root>', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
foreach( $xpath->query('//*[not(node())]') as $node ) {
$node->parentNode->removeChild($node);
}
echo substr($dom->saveHTML(), 6, -8);
Run Code Online (Sandbox Code Playgroud)
请参阅IDEONE演示
结果: <div><h2>Hello world</h2><p>It's 7Am where I live</p></div>
请注意,基于XPath的空节点清理是必要的,因为DOM包含空<h2></h2>,<p></p>以及<div></div>将HTML加载到DOM后的标记.
该<root>元素在一开始加入到确保我们得到根元素好吗.之后,我们可以用它进行后期处理substr.
该LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD所以没有DTD和其他垃圾没有添加到DOM标志是必要的.