Javascript 需要自定义正则表达式
使用javascript,我需要解析页面的HTML,并用内容块中出现的ABC替换所有ABC,例如Javascript 需要自定义正则表达式,javascript,jquery,regex,Javascript,Jquery,Regex,使用javascript,我需要解析页面的HTML,并用内容块中出现的ABC替换所有ABC,例如ABC公司lorem ipsum将更改为ABC公司lorem ipsum但mailto:joe@abccompany.com将保持不变 所以在任何地方都可以用空格或引号来代替ABC,但显然我想让它更通用一些。也许表达式会说,当它的前面/后面是[a-zA-z]时,它不是 到目前为止,我所拥有的: <script type="text/javascript"> $(document).
ABC公司lorem ipsum
将更改为ABC公司lorem ipsum
但mailto:joe@abccompany.com
将保持不变
所以在任何地方都可以用空格或引号来代替ABC,但显然我想让它更通用一些。也许表达式会说,当它的前面/后面是[a-zA-z]
时,它不是
到目前为止,我所拥有的:
<script type="text/javascript">
$(document).ready(function() {
$('body').find('div').each(function(i, v) {
h = $(v).html();
if (h.indexOf('abc') > 0) {
h = h.replace('abc', '<span class="abc">abc</span>');
$(v).html(h);
}
});
});
</script>
$(文档).ready(函数(){
$('body')。查找('div')。每个(函数(i,v){
h=$(v.html();
如果(h.indexOf('abc')>0){
h=h。替换('abc','abc');
$(v).html(h);
}
});
});
我建议使用另一种方法来保存元素上的数据和事件,并且不干扰所述元素上的属性
$("body div").find("*").addBack().contents().filter(function(){
return this.nodeType === 3;
}).each(function() {
$(this).parent().html(this.nodeValue.replace(/abc/g, '<span class="abc">abc</span>'));
})
$(“body div”).find(“*”).addBack().contents().filter(函数(){
返回this.nodeType==3;
}).each(函数({
$(this.parent().html(this.nodeValue.replace(/abc/g,'abc'));
})
注意,由于使用了
.addBack()
,需要jQuery 1.9+,对于较旧的版本,替换为.andSelf()
,这不是一件非常有效的事情(循环遍历DOM中的所有div标记并对每个标记应用正则表达式),但由于我不知道您有什么约束条件,也不知道您在什么情况下使用此代码,我想你这样做是有充分理由的
无论如何,这个正则表达式似乎符合您的需求(尽管不是很好定义的需求):
h=h.replace(/([^A-Z])(ABC)([^A-Z])/gi,$1$2$3');
在这里摆弄:以防万一,以这种方式进行替换将导致这些div中elments上所有存储的数据和绑定事件丢失。啊,我认为这个实现出现了一些可怕的错误,因为它花了5分钟的时间。这应该可以让你有一部分的方法:实际上必须从节点导航到它最近的父元素,并修改该元素的文本内容。如果我没有错的话,您的代码将使
abc
变为abc
,替换逻辑更加可靠,但正则表达式将替换所有逻辑。我需要排除电子邮件地址(或类似情况)中的实例。是否还要将fooabcbar
替换为fooabcbar
?如果你还想确保它不会在电子邮件地址中被替换,那么这就非常困难。如果abc被其他信件包围,它很可能不会被替换。大多数情况下都是空谈abc或“abc空谈”
h = h.replace(/([^A-Z])(ABC)([^A-Z])/gi, '$1<span style="color: red">$2</span>$3');