如果匹配项在特定的html标记中,则跳过regex匹配
skip regex matching if the match is within a particular html tag
这是对以下内容的后续操作: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.
/<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>
- Regex匹配除“”之外的所有字符;.js”;
- RegExp:匹配Javascript中除regex值之外的所有内容
- 在javascript中,I'我很难弄清楚如何让regex只替换捕获而不替换匹配
- 如果匹配项在特定的html标记中,则跳过regex匹配
- RegEx只匹配JSON字符串中最里面的数组
- RegEx以匹配字符串中的两个或多个名称
- Regex模式匹配,从Javascript中的字符串中提取时间,结果出乎意料
- 为什么JS RegEx提取多个值(只有一个匹配)
- 组合regex,同时匹配两者,而不是两者都匹配
- Regex-从字符第N次出现到字符串末尾的匹配
- regex来构建字符串,直到遇到第N个匹配项
- RegEx将有理文字与小数匹配,但不完全有理文字除外
- Regex:匹配以“AM”结尾的单词(不区分大小写比较)
- Regex有助于突出显示html中匹配文本的角度过滤器
- 找到一种方法来查找没有't匹配Regex是javascript
- 获取子字符串,直到第n个匹配regex
- 在coffeescript中匹配regex和模板
- 如果不在特定的HTML标记内,则匹配Regex
- 先找其href匹配regex的标记
- 匹配RegEx中的第一行内容