75年生人,程序员,在西安。

匹配关键字,但不匹配链接中的关键字

常有这样一种需求,将正文中的关键字加上链接,本来写个简单的查询替换方法即可,

some sentence with keyword and a link: <a href="https://someweb/somelinke">there is a sentence with keyword in it.</a> 

但有些网站的正文本身就是html格式的保存在数据库中,所以有一种情况就是关键字外面已经有了链接,再替换成一个带链接的html代码,就会出现两个链接嵌套的错误。

<a href="https://someweb/somelinke">there is a sentence with <a href="search?kw=keyword">keyword</a> in it.</a> 

以下便是这个所谓的“反向零宽断言”正则表达式,就可以实现只查找链接外的关键字效果:

var rgx = /keyword(?![^<]*?<\/a>)/ig


还有,例如想替换html标签属性中的双引号为单引号,但正文中(标签外)的双引号不被替换,可以使用如下正则表达式:

var rgx = /\"(?=[^<]*?>)/ig

示例代码(为解决群内成员的问题而做的):

<!DOCTYPE html>
<html>
<head>
<title>test</title>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" media="all" href="js/ligerui/skins/Aqua/css/ligerui-all.css"/>
<script type="text/javascript" src="js/jquery-1.6.1.min.js"></script>
</head>
<body>
<script type="text/javascript">
var ss = "\"<a href=\"https://xxx.xx\" target=\"_blank\">https://xxx.xx</a>,<p class=\"style1\">fsfsf</p><a href=\"https://xxx.xx\" target=\"https://xxx.xx\">https://xxx.xx</a>\" 我想要拿到\" < >\"之间的内部的 双引号\" 替换成单引号',谁有什么办法没有哦?哪位兄弟正则表达式写的好一些帮一下忙撒";
var re = /\"(?=[^<]*?>)/ig;
alert(re.test(ss));
var aa = ss.replace(re, "'");
alert(aa);

var re = new RegExp("<(([^>]*?)\")+>","ig");
var arr = ss.match(re);

s = "$1 contains: " + arr[0] + "\n";
s += "$2 contains: " + arr[1] + "\n";
s += "$3 contains: " + arr[2];
alert(s);
var kk = "some sentence with keyword and a link: <a href=\"https://someweb/somelinke\">there is a sentence with keyword in it.</a>"
var rg = /keyword(?![^<]*?(<\/a>|>))/ig;
var bb = kk.replace(rg, "==replaced==");
alert(bb);

</script>
</body>
</html>

如果是在php中,则是这样写:

$pattern = '/'.$keyword.'(?![^<]*?(<\/a>|>))/';

// 上面这句可以解决属性中及链接中的所有情况,还有一种情况就是链接中文字后面还有其他标签,以后再想想,思路差不多了。


评论

© 世风十三 | Powered by LOFTER