javascript - 求一段js正则表达式
迷茫
迷茫 2017-04-10 14:51:10
[JavaScript讨论组]

我有一段html代码,要把里面的几个文字替换成链接,而如果这些字符是html标签的属性,则不替换。如:

html测试seo信息<img src="/aaseobbc.jpg" width="140" height="140" alt="" />

比如,我要替换里面的seo为<a href="http://www.test.com/">seo</a>。替换前面的,而不替换后面的图片地址里面的那个。

我写了一段可以正常的替换这个:

javascriptvar str='测试seo信息<img src="/aaseobbc.jpg" width="140" height="140" alt="" />';
str.replace(/([^<]*)(seo)([^>]*)/g,'$1<a href="http://www.test.com">$2</a>$3')

但是碰到一段类似seoseoseoseo这样的就只能替换最后一个了。

还有就是a标签内部的也是不用替换的。都帮忙啊,谢谢啦!


已解决,解决思路是,先不论上面的那些规则,统一的都替换掉,然后再把替换错了的用两个正则替换回来,相关代码如下:

javascriptfunction replaceTags(content,tag,link){
    tag=tag.replace(/\\/g,"、").replace(/\//g,"\\/");
    //全部替换掉
    var reg=new RegExp(tag,"gi")
    content=content.replace(reg,link)
    //把标签里面的属性再替换回来,因为有可能不存在,所以用了try catch,下同
    var mcs=/(<[^<|>]+)(<a[^>]*>([^<]*)(<\/a>))([^<|>]+>)/gi.exec(content);
    try{
        content=replaceAll(content,mcs[0],mcs[1]+mcs[3]+mcs[5]);
    }catch(e){}
    //把a标签里面的都替换回来。
    var mcs2=/(<a[^>]*>[^<]*)(<a[^>]*>)([^<]*)(<\/a>)([^<]*<\/a>)/.exec(content);
    try{
        content=replaceAll(content,mcs2[0],mcs2[1]+mcs2[3]+mcs2[5]);
    }catch(e){}
    return content;
}

上面的代码里面有个replaceAll方法,是用asp实现的,这样就不用js的正则了。

另外多谢大家的帮助!^_^!

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(3)
怪我咯

题主试试用零宽断言解决,比如这样:

var content = $('#content').html();
var replacement = '<a href="http://www.test.com/">seo</a>'
$('#content').html(content.replace(new RegExp('seo(?!.*>)','gm'),replacement)
    .replace(new RegExp('seo(?=.*<)','gm'),replacement));
高洛峰

可以不用这么复杂的正则表达式的。。写一个递归函数枚举网页中全部元素,如果该元素为文本节点则用一个简单的正则替换掉seo就好了~

高洛峰

首先你得

有個 html 解析器。

然後,如樓上所說遞歸枚舉文本節點,替換。

理論上,標準的正則表達式做不到這一點。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号