正则表达式以匹配<a>不在标签内的短语



我有一些HTML,我需要匹配一个不在<a>标签内的短语"My Phrase"。

不应匹配的短语:

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

应匹配的短语:

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

当前的解决方案使用负预视来查找没有后跟结束</a>标记的匹配项:

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

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

正如您在示例中所看到的,它适用于常规文本链接(案例 1(,但当"a"标签内嵌套了其他标签时,它适用于情况 2。

有没有人有一个对两者都有效的负面展望正则表达式?

我不能对正则表达式(例如(?<!<a.*?>.*?)My Phrase(?!.*?</a>)(使用负面回溯,因为我java.util.regex.PatternSyntaxException: Look-behind group does not have an obvious maximum length收到错误。我也不想解析 HTML 并删除所有当前的"a"标签,因为我需要保持 HTML 完整并将"我的短语"替换为"另一个短语"。

您要做的并不是那么微不足道,因为实际上不可能(只有 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/

最新更新