Preg_replace匹配单词boundery而不是链接

Loy*_*oyC 0 php regex preg-replace

我正在尝试编写一个正则表达式来匹配boundery上的单词,因为文本是html我需要避免使用的单词<a>here more words</a>.

我现在的正则表达式是: /\bword\b/u

示例文字:

<p>Example lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur <a href="">porta lorem nec</a> tortor laoreet gravida.</p>
Run Code Online (Sandbox Code Playgroud)

搜索单词lorem应仅在开头而不是在<a>.

Ham*_*mZa 6

您可以使用如下的一些黑暗力量:

<a[^>]*>.*?</a\s*>(*SKIP)(*FAIL)|\blorem\b

让我们分解一下:

<a[^>]*>            # match an opening "a" tag
.*?                 # match anything ungreedy until ...
</a\s*>             # match a closing "a" tag
(*SKIP)(*FAIL)      # skip it
|                   # or
\blorem\b           # match lorem with boundaries
Run Code Online (Sandbox Code Playgroud)

所以基本上我们首先跳过所有a标签,然后匹配lorem.

See a working demo

  • 你不需要检查`lorem`是否在`<a ..> .. </a>`标签内. (2认同)
  • 模式的第一部分的目标是避免<a>标签,因为`lorem`可以在里面.但是要检查正则表达式引擎必须从`<a\b`到它遇到`</ a>`,无论是否存在`lorem`.结论,无需检查`lorem`是否在这里.您可以写:`<a\b [^>]*>.*?</a>(*SKIP)(*FAIL)|\blorem\b`代替. (2认同)
  • 换句话说,您可以跳过字符串的所有`<a>`标记. (2认同)