正则表达式为PHP找到所有自动关闭标签

时间:2010-12-13 23:27:32

标签: php xhtml preg-match domdocument

我有一个使用DomDocumentFragment的系统,该系统是根据数据库或系统的其他区域(即其他XHTML代码)的标记创建的。

可能包含的一个标签是:

<div class="clear"></div>

在将字符串添加到DomDocumentFragment之前,内容是正确的 - 该类正在正确关闭。

但是,DomDocumentFragment会将其转换为:

<div class="clear"/>

由于标签关闭不正确,在浏览器中无法正确显示。

所以我的想法是后处理DomDocument返回给我的XML字符串(包括不正确的div结构,如上所示),并将自闭标记转换回正确的结构...即转回

但是我遇到了preg_match模式找到这些标签的问题 - 我看到一些模式会返回所有标签(即查找所有标签),但不仅仅是那些自动关闭的模式。

我已经尝试过这方面的一些事情了,但是我的头部与正则表达式有点混淆(我开始过度复杂化的事情)

/<div(["\d\w\s])\/>/

目标是匹配模式,其中“....”可以是任何有效的XHTML属性。

有什么建议或指示让我回到正轨?

2 个答案:

答案 0 :(得分:1)

限制问题域 - 您需要将<div class="clear"/>更改为<div class="clear"></div> ...因此请搜索前者,并使用简单的查找和替换操作将其替换为后者。它应该更快,肯定更安全

无论你做什么,尝试parse HTML with a regular expression(你试图通过构建一个可以检测具有任意属性的<div>的正则表达式来做到这一点。)< / p>

答案 1 :(得分:0)

<div></div>

进入DomDocumentFragment实际上并没有将其改为

<div/>

将其更改为

A-DOM-Element-Node-with-name-"div"-and-no-content.

仅当DomDocumentFragment 序列化时,才会创建<div></div><div/>。换句话说,问题不在于DomDocumentFragment,而在于您正在使用的序列化过程。

PHP不是我的语言,所以我无法提供更多帮助,但我会为您的DomDocumentFragment寻找与HTML兼容的序列化程序,而不是在序列化后尝试修补输出。