2011-01-25 87 views
3

我使用VB.NET并且想要将http://添加到尚未以http://,https://,ftp://开头的所有链接并且等等。将http://添加到没有协议的所有链接

"I want to add http here <a href=""www.google.com"" target=""_blank"">Google</a>, 
but not here <a href=""http://www.google.com"" target=""_blank"">Google</a>." 

当我刚刚有链接时很容易,但是我找不到包含多个链接的整个字符串的一个好的解决方案。我猜RegEx是要走的路,但我甚至不知道从哪里开始。

我可以自己找到RegEx,它是解析和预计我遇到问题。任何人都可以给我一个在C#或VB.NET中使用Regex.Replace()的例子吗?

任何帮助表示赞赏!

+1

嗯......怎么在这里左右? `on this site` – Piskvor 2011-01-25 12:01:28

+0

如果您参考本地网站,您会做什么?像Home 编辑:太晚了... – 2011-01-25 12:02:28

+0

在这种特殊情况下,这并不重要,但感谢您指出。 – 2011-01-25 12:10:29

回答

1

报价RFC 1738:

“计划名称由字符序列的小写字母表示。 ”A“ - ” Z “数字和字符加( ”+“),句点(” 。“)和连字符(” - “)是允许的。对于弹性,解释URL的程序应该将大写字母视为等同于方案名称中的小写字母(例如,允许”HTTP“以及”http“)。

非常好!一个匹配的正则表达式:

/^[a-zA-Z0-9+.-]+:\/\// 

如果匹配您的href字符串,请继续。如果不是,请在前面加上“http://”。除非您询问具体细节,否则其余的健康检查属于您。请注意其他评论者对相关链接的想法。


编辑:我开始怀疑你问错了问题......你也许没有什么,其将文本成你需要处理它的个人标记。见Looking for C# HTML parser


编辑:由于盲目的尝试,在忽略所有的,只是攻击的文本,用不区分大小写的匹配,

/(<a +href *= *")(.*?)(" *>)/ 

如果第二反向引用匹配/^[a-zA-Z0-9+.-]+:\/\//,什么也不做。如果不匹配,与

$1 + "http://" + $2 + $3 

更换这并不是C#语法,但它应该跨越翻译没有太多精力。

0

如果你不与潜在搞乱本地链接,你可以随时保证字符串将是完全合格的域名有关,那么你可以简单的使用方法包括:

Dim myUrl as string = "someUrlString".ToLower() 

If Not myUrl.Contains("http://") AndAlso Not myUrl.Contains("https://") AndAlso Not myUrl.Contains("ftp://") Then 

    'Execute your logic to prepend the proper protocol 
    myUrl = "http://" & myUrl 

End If 

请请注意,在添加中使用哪个协议以及URL是否相对时,省略了很多漏洞。

编辑:我特意选择不提供RegEx解决方案,因为这是一个简单的检查,RegEx对它有点重要(IMO)。

1

在PHP(应该翻译有点容易)

$text = preg_replace('/href="(?:(http|ftp|https)\:\/\/)?([^"]*)"/', 'href="http://$1"', $text); 
1

C#

result = new Regex("(href=\")([^(http|https|ftp)])", RegexOptions.IgnoreCase).Replace(input, "href=\"//$2"); 
相关问题