加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用正则表达式和php匹配未关闭的html标签

发布时间:2020-12-13 21:52:50 所属栏目:百科 来源:网络整理
导读:我使用php和 regex在字符串中查找未关闭的html标签: 这是我的字符串: $s="divh2Hello worldh2pIt's 7Am where I livepdiv"; 您可以看到此处的所有标记均未关闭. 我想找到所有未关闭的标签,但问题是我的正则表达式也匹配开始标签. 到目前为止,这是我的正则
我使用php和 regex在字符串中查找未关闭的html标签:

这是我的字符串:

$s="<div><h2>Hello world<h2><p>It's 7Am where I live<p><div>";

您可以看到此处的所有标记均未关闭.

我想找到所有未关闭的标签,但问题是我的正则表达式也匹配开始标签.

到目前为止,这是我的正则表达式

/<[^>]+>/i

这是我的preg_match_all()函数

preg_match_all("/<[^>]+>/i",$s,$v);

print_r($v);

在正则表达式中我需要更改哪些内容才能匹配未关闭的标记?

<h2>
 <p>
 <div>
您可能没有意识到这一点,但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);

见IDEONE demo

结果:< div>< h2> Hello world< / h2>< p>我住的地方是7Am< / p>< / div>

请注意,基于XPath的空节点清理是必要的,因为DOM包含空< h2>< / h2>,< p>< / p>和< div>< / div>将HTML加载到DOM后的标记.

< root>在开头添加元素以确保我们获得根元素.之后,我们可以使用substr进行后处理.

LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD标志是必需的,因此没有DTD和其他垃圾没有添加到DOM.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读