【问题标题】:Regex to match a phrase that is not inside an <a> tag正则表达式匹配不在 <a> 标记内的短语
【发布时间】:2018-05-12 12:53:22
【问题描述】:

我有一些 HTML,我需要匹配一个不在 &lt;a&gt; 标记内的短语“我的短语”。

不应匹配的短语:

1. <a>My Phrase</a>
2. <a><strong>My Phrase</strong></a>

应该匹配的短语:

3. <strong>My Phrase</strong>
4. My Phrase

我的当前解决方案使用否定前瞻来查找后面没有结束 &lt;/a&gt; 标记的匹配项:

My Phrase(?![^<]*>|[^<>]*<\/a)

https://regex101.com/r/n1d9KZ/1

正如您在示例中看到的那样,它适用于常规文本链接(案例 1),但在“a”标签内嵌套其他标签时会中断案例 2。

是否有人有适用于两者的负前瞻正则表达式?

我不能对诸如(?&lt;!&lt;a.*?&gt;.*?)My Phrase(?!.*?&lt;\/a&gt;) 之类的正则表达式使用否定的lookbehind,因为我收到错误java.util.regex.PatternSyntaxException: Look-behind group does not have an obvious maximum length。我也不想解析 HTML 并删除所有当前的“a”标签,因为我需要保持 HTML 完整并将“My Phrase”替换为“Another Phrase”。

【问题讨论】:

  • jsoup 之类的库将大大减少 HTML 解析的麻烦。

标签: java html regex negative-lookahead


【解决方案1】:

您尝试做的事情并非微不足道,因为实际上不可能(只有 Jeff Dean 可以)使用 RegEx 完全处理 HTML。

因为可能到处都有新行,具有复杂的属性和嵌套或只是无效。

无论如何,在您的示例的情况下(没有 href,标签内和标签内没有新行),您可以执行以下操作:

result = text.replace(/^.*?(My Phrase).*?$/gm, function($0,$1) { 
    var regEx = new RegExp("(" + $1 + ")");
    return $0.indexOf('<a') >= 0 ? $0 : $0.replace(regEx, '<b>$1</b>');
});

我只是在示例中将匹配项加粗,但您可以在回调中做很多事情:https://jsfiddle.net/8Ls0qbvj/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2014-08-30
    • 2016-12-26
    • 1970-01-01
    相关资源
    最近更新 更多