PHP:正则表达式替换而忽略html标记之间的内容

时间:2011-04-16 18:16:01

标签: php html regex tags

我正在寻找一个正则表达式字符串,可以在html标签之间找到一个单词或正则表达式字符串。

我想替换(alpha | beta):希腊字母表中的前两个字母是alpha<b>beta</b>

我只想让它替换alpha,因为beta介于&lt;&gt;之间标签。所以请忽略(<(.*?)>(.*?)<\/(.*?)>)

:)

2 个答案:

答案 0 :(得分:3)

我没有测试此页面中使用的逻辑 - http://www.phpro.org/examples/Get-Text-Between-Tags.html但我可以用粗体字母确认页面顶部的逻辑点,说明不应该做正在尝试用正则表达式做的事。

如果您使用正则表达式在任何真实世界的情况下处理这些标签的内容,那么Html是不统一的并且边缘情况总是会让您陷入困境。因此,除非你的标记非常简单,统一,100%准确,只包含html(不是css,javascript或者垃圾),那么你最好的选择是dom解析器库。

真的很多dom解析器库也存在问题,但你会比正则表达式的同行还要快。获取标签文本的最佳方法是在浏览器中呈现html并访问给定dom节点的innerText属性(或者具有人工副本并手动粘贴内容) - 但这并不总是一个选项:d

答案 1 :(得分:1)

这可能是'错误'的方式,但它确实有效:当我需要做类似的事情时,我首先要preg_replace_callback找到我想要匹配的内容用base64编写它。

然后我可以愉快地在结果上运行一个普通的preg_replace,因为它知道它没有机会匹配我想忽略的字符串。然后使用preg_replace_callback中的相同模式进行解扰,这次将匹配发送到base64解码。

我经常在自动向文本添加关键字或词汇表链接或工具提示时执行此操作 - 我自己加扰HTML标记,这样我就不会尝试在锚标记的标题内创建链接或工具提示比如荒谬。