Javascript 需要自定义正则表达式

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).

使用javascript,我需要解析页面的HTML,并用内容块中出现的ABC替换所有ABC,例如
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');