正则表达式在文本中查找URL并将其作为链接

时间:2011-03-10 14:33:16

标签: regex

我正在尝试输出一个字符串作为html,其中包含链接。我想让这些链接成为实际链接。 我的测试字符串=“https://www.google.com http://yahoo.com www.msn.com www.google.com” 我的代码:

Dim oRegEx As New Regex("((https?:\/\/|www\.)([-\w\.]+)+(:\d+)?(\/([\w\/_\.]*(\?\S+)?)?)?)", RegexOptions.IgnoreCase)
Dim matches As MatchCollection = oRegEx.Matches(sTextToConvert)

For Each match As Match In matches
    If (match.Value.StartsWith("www.")) Then

         sTextToConvert = sTextToConvert.Replace(match.Value, "<a href='http://" & match.Value & "' target=""_blank"">" & match.Value & "</a>")
     Else
         sTextToConvert = sTextToConvert.Replace(match.Value, "<a href='" & match.Value & "' target=""_blank"">" & match.Value & "</a>")
     End If
Next

Return sTextToConvert

我的问题是,由于www.google.com是字符串中的两倍,当我执行替换时,它会替换我已替换的字符串“https://www.google.com。”

的一部分。

以下是替换后的内容

<a href='https://<a href='http://www.google.com' target="_blank">www.google.com</a>' target="_blank">https://<a href='http://www.google.com' target="_blank">www.google.com</a></a> <a href='http://yahoo.com' target="_blank">http://yahoo.com</a> <a href='http://www.msn.com' target="_blank">www.msn.com</a> <a href='http://www.google.com' target="_blank">www.google.com</a>

3 个答案:

答案 0 :(得分:1)

找到一个杀手灵魂

我只是使用它,它会处理所有链接。

返回Regex.Replace(sTextToConvert,“((https?:\ / \ / | www。)([ - \ w。] +)+(:\ d +)?(\ /([\ w \ / _ 。] *(\?\ S +)?)?)?)“,”$ 0“)

答案 1 :(得分:1)

这不是一项微不足道的任务!

事实上,这个网站的霸主写了一篇关于这个主题的博客文章。见:The Problem With URLs。 (但要获得问题的要点和范围,你真的需要阅读整个评论主题。)这是我在那里做的评论(为时已晚),适用于此:

  

我一直在努力研究这个(有趣且具有挑战性)的问题,并提出了一个相当不错的单一正则表达式解决方案(PHP和Javascript)。它正确处理:分隔的URL(在(括号),[方括号],&lt;尖括号&gt;,{花括号},'单引号'和“双引号”),跳过已链接的URL(在HTML和BBCode中)语法),正确排除尾随标点符号(即使与引号混合),并且不使用复杂的正则表达式构造(即没有后瞻性,因此它在Javascript中工作。)它也正确处理HTML实体形式的分隔符。

     

我已经发布了Javascript和PHP脚本作为开源,任何有兴趣的人都可以从Github下载它们:“LinkifyURL”。以下是Javascript测试页面的链接,该页面演示了Javascript版本,并提供了两个脚本使用的正则表达式的详细注释列表:   URL Linkification (HTTP/FTP)

     

正则表达式相当复杂(但事实证明这个问题也是如此)。如果您正在使用RegexBuddy库文件作为Github项目的一部分。

另请参阅John Gruber的:An Improved Liberal, Accurate Regex Pattern for Matching URLs。他的正则表达式相当不错(但它在某些条件下确实遭受了灾难性的回溯 - 即当一个url有嵌套括号而内部括号为空时。)

答案 2 :(得分:0)

Matches仅用于检索字符串的一部分。

请改用Replace。它所采用的一个参数是将匹配的字符串转换为替换字符串的函数(参见那里的示例)。