2011-08-22 54 views
0

我从WMD showdown.js文件得到了这个正则表达式模式。检测超链接的正则表达式

/<((https?|ftp|dict):[^'">\s]+)>/gi 

而且代码:

text = text.replace(/<((https?|ftp|dict):[^'">\s]+)>/gi,"<a href=\"$1\">$1</a>"); 

但是,当我设置texthttp://www.google.com,它没有固定在那里,它返回的是原始文本值(http://www.google。 COM)。

P.S:我用RegexPal进行了测试,结果不符。

+2

把<>出来,它应该工作这看起来是最好的:'(http | ftp | https):\/\/[\ w \ -_] +(\。[\ w \ -_ ] +)+([\ w \ - \。,@?^ =%&:/〜\ +#] * [\ w \ - \ @ @^^ =%& /〜\ +#])?'From http ://regexlib.com/Search.aspx?k=URL&AspxAutoDetectCookieSupport = 1 – Rob

+1

上次有人回答关于正则表达式和HTML的问题时,这让他们生气。 http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

+0

所以你只是想把整个网址,并把它放在一个锚标记?在你的例子中,它应该返回'http://www.google.com'? – Ali

回答

0

只要你知道你的网址为http://或https://或者任何你可以使用:

/((https?|s?ftp|dict|www)(://)?)[A-Za-z0-9.\-]+)/gi 

表达式匹配,直到它遇到的URL,即不允许一个字符不是A-Za-z\.\-。它不会检测任何形式的google.com或任何类似于参数或子目录路径等域名的内容。如果这是您的要求,您可以简单地选择终止终止条件,就像您在上面的正则表达式中那样。

我知道这似乎毫无意义,但它可能是有用的,如果您希望显示名称缩写而不是整个url的情况下复杂的URL。

+0

在URL中有很多其他字符是有效的,除了空格之外几乎任何东西都是允许的。 – RobG

+0

忽略国际化域名...不,基本上只有'A-Za-z0-9 \ -'可以在域名中使用 - 不能是前导字符或最后一个字符。 LordCover(提问者)来自叙利亚,所以我认为他真的应该决定什么是有效的。无论哪种方式,这个正则表达式仅用于提取不需要开始的域名。 (查看有效字符http://en.wikipedia.org/wiki/Domain_name) – Ali

2

您的代码正在搜索<>包裹的网址,例如:<http://www.google.com>RegexPal

只是将其更改为/((https?|ftp|dict):[^'">\s]+)/gi如果你不希望它搜索<>RegexPal

0

你可以使用:

var re = /(http|https|ftp|dict)(:\/\/\S+?)(\.?\s|\.?$)/gi; 

有:

el.innerHTML = el.innerHTML.replace(re, '<a href=\'$1$2\'>$1$2<\/a>$3'); 

也以句子结尾的匹配的URL。

但是,您需要非常小心这种技术,确保元素的内容或多或少为纯文本而不是复杂的标记。正则表达式并不意味着处理或解析HTML,也不擅长处理或解析HTML。