如果匹配项在特定的html标记中,则跳过regex匹配

skip regex matching if the match is within a particular html tag

本文关键字:匹配 regex html 如果      更新时间:2023-09-26

这是对以下内容的后续操作:Javascript正则表达式占位符打印字符串而不是其值

我正在尝试构建一个javascript函数,用于查找模式并将其转换为链接。

var re = /Ticket-([0-9]*?(?=-)-[0-9]*)/; 
var str = 'ASD Ticket-492-367 - Make my day.'; 
t = str.replace(re,'<a href="http://myworld/ticket/$1">$&</a>')

我现在遇到了一个问题,如果我的字符串已经包含<a>标记,它会试图锁定额外的标记,这会使输出变得很奇怪。正则表达式匹配是否有一种特定的jQuery/JS方法可以跳过放置在特定标记中的内容。比如,以某种方式将<div>标记包装在内容周围,然后将其解析为DOM节点。。。并以这种方式进行操作。我是JS的新手,所以如果我的想法完全偏离了,请道歉

更新:用于用例。假设我收到的文本已经有一个链接,比如下面的链接:

<a href="http://myworld/ticket/4385-21557">Ticket-4385-21557 - abc xyz</a>

这将在匹配字符串"Ticket-4385-21557"周围包裹另一个标签。这是系统中已经存在的遗留字符串,无法更改。因此,我们的想法是通过跳过<a>标记

中的字符串来解决它

一个完整的答案取决于对您正在处理的输入有更多的了解,但我认为我肯定可以让您走上正确的道路。

没有固有的方法可以说"替换这个东西,除非在另一个东西中。"然而,你可以将交替和函数替换结合起来解决这个问题。

在问题的核心,您实际上在寻找两种不同的东西:<a>标记,您希望忽略它,以及特定格式的字符串(为了保持答案的简单性,我将在这里将其简化为类似/Ticket-'d+/的东西)。这意味着交替。问题是,如何告诉正则表达式识别选择了哪个替换?最简单的方法是使用功能替换:

var test = '<a href="#">Ticket-37</a> blah blah Ticket-42';
// expected output:
// <a href="#">Ticket-37</a> blah blah <a href="#">Ticket-42</a>
var output = test.replace(/<a's.*?<'/a>|Ticket-('d+)/g, function(m, g1) {
    if(/^<a's/.test(m)) return m;  // ignore existing links
    return '<a href="#">Ticket-' + g1 + '</a>';
});

这里发生的情况是,.replace调用正在查找<a>标签或类似/Ticket-'d+/的东西,它将替换所有这些标签。然而,对于<a>标签,它只是将它们替换为原来的标签;基本上不修改它们(这是一个很好的特性,因为如果您也需要清理<a>标记,您实际上可以在这里重新格式化它们)。

标准警告适用于将正则表达式与HTML一起使用:您不能保证使用正则表达式正确解析HTML。HTML不是一种常规语言,所以你能做的最好的事情就是覆盖大多数合理的情况。当然,构建HTML来挫败这种方法是可能的。你有可能在现实中看到这一点吗?这取决于你的现实是什么,但可能不是。"健壮"的解决方案是使用HTML解析器,查找文本节点(不是<a>节点的直接子节点),并在解析的树中进行替换。

如果您从DOM元素中获取str,您可以使用.text()只获取没有html 的文本

HTML

<div class="with-anchor"><a href="http://example.com">ASD Ticket-492-367</a> - Make my day.</div>

JS-

var str = $("div.with-anchor").text(); // ASD Ticket-492-367 - Make my day.
aopen 的正则表达式
/<a.*href='".*"?">>?/ig  

aclose 的正则表达式

/(<'/a>)?<'s?'/a?>?'s>/ig

在使用原始正则表达式之前,您可能希望使用它们来解析字符串。a.e

var t = str.replace(aopen, '');
t = t.replace(aclose, '');
t = t.replace(re, '<a href="blahblah">$&</a>);
document.write(t);

我创造了一把小提琴,但由于某种原因,它无法保存。这是我的代码-Javascript:

window.onload = function() {
var re = /Ticket-([0-9]*?(?=-)-[0-9]*)/g; 
var str = document.body.innerHTML; 
var aopen = /<a.*href='".*"?">>?/ig;
var aclose = /(<'/a>)?<'s?'/a?>?'s>/ig
t = str.replace(aopen, '');
t = t.replace(aclose, '');
t = t.replace(re,'<a href="http://myworld/ticket/$1">$&</a>')
document.write(t);
}

这是我的代码-HTML:

<!DOCTYPE html>
<html>
<body>
Ticket-445-1235 - Make my day<br>
Ticket-445-1255 - Make his day<br>
Ticket-443-4356 - He's feeling lucky<br>
Ticket-443-5555 - punk<br>
<a href="whatever.txt">Ticket-423-5557 - Sdadf </a> <br>
</body>
</html>