我有一些正则表达式代码可将字符串中的任何网址http://www.url.com
转换为超链接,即<a href='http://www.url.com'>http://www.url.com</a>
正则表达式代码:
var exp = /(\b(https?|):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
toReturn = toReturn.replace(exp,"<a target='_blank' href='$1'>$1</a>");
但是我不希望它专门搜索/替换某些字符[img] [/ img]
**注意:[img] [/ img]和网址可能在字符串中多次...
我该怎么做?
非常感谢,
答案 0 :(得分:1)
仅仅使用正则表达式会非常棘手。这是因为正则表达式只能匹配regular languages *,并且任何具有打开/关闭标记的语言都不太可能是常规的。
(*在实践中,大多数编程语言中的“正则表达式”实际上并不是常规的,并且具有匹配更复杂语言的设施......但我很少发现这些设施有用,我认为它们不值得用于此问题)。
更好的方法是编写一个简单的解析器,根据标记拆分输入,然后只针对可能包含URL的部分运行正则表达式。
例如:
function fix_urls(str) {
var result = [];
var url_re = /\bhttp:…/g;
var tag_re = /(\[\/?[a-zA-Z]+\])/g;
var split = str.split(tag_re);
var in_tag = 0;
for (var i = 0; i < split.length; i += 1) {
var part = split[i];
if (part.search(tag_re) == 0) {
if (part[1] == "/")
in_tag -= 1;
else
in_tag += 1;
} else if (in_tag == 0) {
part = part.replace(url_re, "<a …>…</a>");
}
result.push(part);
}
return result.join("");
}
答案 1 :(得分:0)
当需要上下文敏感的编辑时,全局替换只是错误的方法。您可以使用 scanner 找到连续的标记,然后在循环输出中更改一些标记,并进行一些编辑。我无法使用标准的javascript或其regexp方法找到如何做到这一点。如果您找到使用regexp或类似名称定义令牌的javascript Tokenizer,那么您几乎就在那里。