【问题标题】:Word Boundary Regular Expression Unless Inside HTML Tag单词边界正则表达式,除非在 HTML 标记内
【发布时间】:2013-06-17 06:13:11
【问题描述】:

我有一个使用单词边界的正则表达式,效果非常好......

~\b('.$value.')\b~i

...保存它与 HTML 标记中的文本相匹配的事实(即 title="This is blue!")。这是一个问题,因为我正在对正则表达式匹配的任何内容进行文本替换,然后使用那些 title 标记显示工具提示。因此,正如您可以想象的那样,它替换了标题中的文本并破坏了工具提示的 HTML。例如,应该是:

<span class="blue" title="This is blue!">Aqua</span>

...最终变成...

<span class="blue" title="This is <span class=" blue"="">Royal Blue</span>">Aqua</span>

我使用 strip_tags 并没有解决问题;我认为我需要的是一个更好的正则表达式,它根本不会匹配以 blue"> 结尾的内容(在这种情况下,“蓝色”是我正在比较的数组中任何其他颜色的占位符)。

任何人都可以将我需要的内容附加到正则表达式吗?或者您有更好的解决方案?

【问题讨论】:

  • 更好的解决方案是使用 DOM 解析器而不是正则表达式来解析和更改 HTML 文本。
  • 你看过DOMDocument吗?我建议阅读一些示例并尝试解决。
  • 正如@anubhava 建议的那样,您可以在这里查看:developer.mozilla.org/en-US/docs/Web/API/DOMParser
  • 无论如何......替换后你想要的结果应该是什么?

标签: php html regex recursion word-boundary


【解决方案1】:

Davey,重新提出这个问题,因为除了 Dom 解决方案之外,还有一个比目前提到的更好的正则表达式解决方案。这是一个简单的解决方案,只需要一个步骤。

一般的解决办法是

<[^>]*>(*SKIP)(*F)|blue

这是demo

&lt;&gt; 标签内的任何内容都会被跳过。 标签之间的内容,比如蓝色是匹配的,听起来很符合你的需求。

在表达式中,将“蓝色”替换为您喜欢的。

参考

  1. How to match pattern except in situations s1, s2, s3
  2. How to match a pattern unless...

【讨论】:

  • 这绝对是使用纯正则表达式解决问题的绝妙方法。我不知道 *SKIP 存在。
  • 是的,这是一个了不起的功能,仅在 Perl 和 PCRE(PHP、R、Delphi、N++...)中可用
  • 我很乐意为此给你答案,即使经过这么长时间,但似乎 DOM 解析仍然是最佳实践。但我非常喜欢 RegEx!
  • Arrr,我并不是要取消答案,只是提到该功能,但感谢您的想法。 :) 是的,正则表达式很棒。 :)
【解决方案2】:

正则表达式替换通常看起来像是解决方案,但它们可能会产生很多不良副作用,并且不能真正实现您想要的。改为查看 DOMDocument 模型(正如一些评论者所建议的那样)。

但是,如果您坚持使用正则表达式,here's 是关于 SO 的好帖子。它使用两次传递来完成您想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2011-03-28
    • 1970-01-01
    • 2014-06-07
    • 2012-09-24
    相关资源
    最近更新 更多