如果匹配在特定的html标记内,则跳过正则表达式匹配

时间:2015-04-06 20:53:59

标签: javascript jquery html regex

这是一个跟进: Javascript regex placeholder prints string instead of its value

我正在尝试构建一个查找模式并将其转换为链接的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>标记

中的字符串来解决它

3 个答案:

答案 0 :(得分:2)

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

没有固有的方式来说“替换这个东西,除非它在另一件事情中。”但是,您可以组合交替和功能替换来解决此问题。

问题的核心是,你实际上在寻找两个不同的东西:<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>标签。)

Standard caveat适用于使用带有HTML的正则表达式:您无法保证正确解析HTML与正则表达式。 HTML不是常规语言,因此您可以做的最好的事情是覆盖大多数合理的案例。它当然可以构建可以阻止这种方法的HTML。您是否有可能在现实中看到这一点?取决于你的现实,但可能不是。 “强大”的解决方案是使用HTML解析器并查找文本节点(不是<a>个节点的直接子节点)并在解析的树中进行替换。

答案 1 :(得分:1)

如果您从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.

答案 2 :(得分:1)

正则表达式aopen

/<a.*href=\".*"?">>?/ig  

regex for 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>