【问题标题】:PHP: Regex replace while ignoring content between html tagsPHP:正则表达式替换,同时忽略html标签之间的内容
【发布时间】:2011-08-07 00:13:43
【问题描述】:

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

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

我只希望它替换 alpha,因为 beta 在 标签之间。所以忽略(<(.*?)>(.*?)<\/(.*?)>)

:)

【问题讨论】:

  • 在编写问题时考虑使用代码{}按钮
  • 对不起,刚加入这个网站。将来会使用它。 :)
  • 没关系 :) 只是如果您尝试使用标签,如果没有代码包装器,它可能无法工作。
  • 在我看来一切都在 html 的标签之间。
  • @sln,我的意思是在一行。限制在开头和结尾的 \r\n 之间。

标签: php html regex tags


【解决方案1】:

我没有测试此页面中使用的逻辑 - http://www.phpro.org/examples/Get-Text-Between-Tags.html 但我可以确认页面顶部用粗体字表示的逻辑点,即您不应该这样做你想用正则表达式做什么。

Html 不是统一的,如果您在任何实际情况下使用正则表达式来处理这些标签的内容,边缘情况总是会在后面咬您一口。因此,除非您的标记非常简单、统一、100% 准确、只包含 html(不是 css、javascript 或垃圾),否则最好的选择是 dom 解析器库。

确实很多 dom 解析器库也存在问题,但您会比正则表达式对应的库领先数英里。获取标签文本内容的最佳方法是在浏览器中呈现 html 并访问给定 dom 节点的 innerText 属性(或人工复制并手动粘贴内容) - 但这并不总是一种选择:D

【讨论】:

    【解决方案2】:

    这可能是“错误”的方式,但它确实有效:当我需要做类似的事情时,我首先执行preg_replace_callback 来查找我不想想要匹配的内容并对其进行编码使用 base64 之类的东西。

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

    在向文本自动添加关键字或词汇表链接或工具提示时,我经常这样做 - 我自己打乱 HTML 标签,这样我就不会尝试在锚标签的标题内或其他地方创建链接或工具提示例如,荒谬。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多