这是一个跟进: 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>
标记
答案 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>