(PCRE Regex) 除非字符串 (b) 在它之前,否则如何匹配字符串 (a)?

(PCRE Regex) How to match up to string (a) unless string (b) precedes it?

使用 HTML,我想匹配所有包含字符串的标签。例如,我想匹配所有出现字符串 "click here".

的所有 hyperlinks(单独的匹配项;每个完整的 ... 标记一个匹配项)

示例来源 - 我想将其中的每一个作为单独的匹配项进行匹配:

<a href="/somepage">click here</a>
<a href="/somepage">please <b>click here</b> now</a>
<a href="/somepage"><img src="/someimage" alt="click here"/></a>

所以我需要从开始标记开始(例如 <a\s+[^>]+>),然后匹配 "click here" 但 条件 它出现在下一个最接近的 </a> 结束标记。例如,以下不适合:

<a\s+[^>]+>.*?click here.*?</a> 匹配 any link(然后是所有 HTML)直到第一个 "click here"。 <a\s+[^>]+>[^<]*click here.*?</a> 仅在 <a>.

中不存在其他标签时匹配

目前唯一的想法:

<a\s+[^>]+>(?:.*?(?=</a>)) 将匹配特定 <a> 标签内的所有内容,但我不知道如何 "back-check" 匹配 (?:) 组内的文本。这可能吗?

<a [^>]*>(?:(?!<\/a>).)*?\bclick here\b(?:(?!<\/a>).)*<\/a>

尝试 this.See 演示。

https://regex101.com/r/sH8aR8/39

我知道您想匹配包含文本 "click here" 的标签,也许还有其他标签。您还需要避免匹配时的情况:

<a href="#">Hi there</a> <a href="#">Hi, <b>click here</b></a>

而是只匹配第二个

<a href="#">Hi, <b>click here</b></a>

您需要确保标签的开头和 "click here" 文本之间没有结尾。 这应该有效:

<a\s+[^>]+>((?!</a).)*click here.*</a>