如何替换大字符串中的单词,不包括像img / a这样的标签

时间:2012-11-23 12:03:54

标签: php regex preg-replace

我想通过相关主题链接我的描述中的主题...现在我在使用preg_replace()来做同样的事情,但现在我需要帮助格式化正则表达式模式来做到这一点....

我面临的挑战是:

1)描述可以包含所有类型的html标签

2)我的替换功能不应取代标签和标签之间的任何内容

3)它不应该替换任何带有描述的标签的任何属性...比如是否有字符串样式和美,如果我想链接样式作为我的主题..所以在这种情况下它不应该链接'样式'标签的属性,而不是它应该链接样式从“风格和美丽”字符串

上述查询的任何形式的帮助都将受到赞赏....

提前致谢...

2 个答案:

答案 0 :(得分:1)

使用DOMParser类或PHP中可用的几个XML解析库之一,具体取决于输入的形式。

答案 1 :(得分:0)

详细说明我的评论:正则表达式不适合有状态或递归解析,也就是说,它们可以以非常高级的方式匹配,但是任何需要递归或状态的东西,最值得注意的是,任何以某种方式呈树状的东西,无法使用正则表达式进行解析。一些正则表达式方言(例如Perl正则表达式)具有反向引用和其他构造,这些构造将正则表达式扩展到严格的常规解析之外,但即使有这些,事情也会充其量只是痛苦。

相反,做一些理智的事情:找到适合您输入的DOM解析器(例如PHP自己的DOMDocument API),并对生成的DOM树进行处理。应该运行良好的方法是递归遍历DOM树,然后在每个节点上查看它是否是文本节点;如果是,则将简单的搜索和替换逻辑应用于其内容,否则进入其中和/或保持不变。或者,您可以在其上抛出一个XPath表达式,为您提供文本节点,然后直接更改它们。或者你可以将一个合适的替换函数挂钩到XslProcessor中并在XSLT中进行替换 - 如果你熟悉XSLT,这是相当简单的,但如果你不熟悉,那么DOM walker可能更容易实现。