(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 演示。
我知道您想匹配包含文本 "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>
使用 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 演示。
我知道您想匹配包含文本 "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>