【发布时间】:2015-11-24 20:32:02
【问题描述】:
我正在使用 php 和正则表达式在字符串中查找未闭合的 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>
【问题讨论】:
-
你应该看看
tidyphp.net/manual/en/book.tidy.php -
为教育目的自行开发的解决方案:构建一个标记器,基本上可以识别标签(打开和关闭)和任何其他文本片段。使用包含已打开标签的堆栈迭代令牌。如果你遇到一个开始标签,把它放在堆栈上。如果遇到结束标签,检查对应的是否在栈顶:如果匹配,则将其从栈中移除;如果不是,则做出相应的反应(例如,抛出错误或丢弃遇到的结束标记)。
-
这不是正则表达式的用途。
-
@Starkeen:我同意 Brandin 的观点,仅使用正则表达式替换很难解决,我相信您已经在这上面浪费了很多时间。如果我的回答对具体输入没有帮助,请发布这些示例,我很乐意提供帮助。