我在javascript中使用这个正则表达式有些麻烦。同样的正则表达式在PHP中有效,但在JavaScript中会出现这样的错误:“无效的正则表达式:(?”之后无法识别的字符。我的正则表达式为:
text = text.replace(/(?<!\=\")http([A-Za-z0-9:\/\.\+\?\%\@\!\#\&_-]+)/g,
'<a href="http$1" target="_blank" rel="nofollow">http$1</a> ');
问题出在第一部分(?< !\=\"
),但我不知道如何解决它,因为它是PHP或C的正常正则表达式。
这种结构有什么类似的吗?我需要在“http”之前禁止使用符号"
(双引号),以防止像<img>
这样的html元素中的网址替换。
我正在编辑问题,因为符号<
加!
在显示文字后出错。 (也可能会调用错误)。
答案 0 :(得分:3)
我建议不要使用正则表达式来解决这个问题。正则表达式不打算与XML一起使用,因此它们最终会失败。您可以使用以下命令来完成自动链接功能(jQuery):
$('#text').contents().filter(function() {
return this.nodeType == 3;
}).each(function(i, t){
$(t).replaceWith(t.nodeValue.replace(/(http:\/\/[\S]+)/g,
'<a href="$1" target="_blank" rel="nofollow"><b>$1</b></a>'));
});
此正则表达式在文本节点上运行,因此您可以保证找不到像<img>
这样的元素。 Here是一个活泼的小提琴。
请注意,此代码对于具有分层复杂元素的 as-is 不起作用,因为.contents()
仅返回第一级子级。如果适合,您可能需要使用a more complex solution。
然而,使用XML概念(节点,元素,文本节点)是解决问题的方式,因此您将拥有快速,有效且健壮的代码。
答案 1 :(得分:1)
在上面的示例中(包括添加):
var text = 'something bla bla bla like this domain.com/blabla/bla.php or more. <img src="img.com" />'
这对你有用:
var newText = text.replace(/([^ ]*\.com\/[^ ]*)/g,'<a href="http://$1"; target="_blank" rel="nofollow">$1</a>');
输出:
something bla bla bla like this <a href="http://domain.com/blabla/bla.php"; target="_blank" rel="nofollow">domain.com/blabla/bla.php</a> or more. <a img src="img.com" />
基本上,它通过.com/
前面的任何空格以及之后的任何空格来识别网址。它不会抓取<img src="img.com" />
,因为它是.com"
。
如果您只有.com域名,这将有效,如果您有.net,.org等等,那么您必须将这些作为要检查的内容添加。