我使用VB.NET,并希望将http://
添加到尚未以http://,https://,ftp://等开头的所有链接中。
"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()示例?
任何帮助表示赞赏!
答案 0 :(得分:1)
引用RFC 1738:
“方案名称由一系列字符组成。小写字母”a“ - ”z“,数字和字符加(”+“),句点(”。“)和连字符(” - 允许弹性,解释URL的程序应该将大写字母视为与方案名称中的小写字母等效(例如,允许“HTTP”以及“http”)。“
出色!要匹配的正则表达式:
/^[a-zA-Z0-9+.-]+:\/\//
如果匹配您的href字符串,请继续。如果没有,请添加“http://”。除非您询问具体细节,否则剩余的健全性检查均属于您。请注意其他评论者对相关链接的看法。
编辑:盲目尝试忽略所有并且只是攻击文本,使用不区分大小写的匹配,
/(<a +href *= *")(.*?)(" *>)/
如果第二个反向引用与/^[a-zA-Z0-9+.-]+:\/\//
匹配,则不执行任何操作。如果不匹配,请将其替换为
$1 + "http://" + $2 + $3
这不是C#语法,但它应该翻译而不需要太多努力。
答案 1 :(得分:1)
在PHP中(应该很容易翻译)
$text = preg_replace('/href="(?:(http|ftp|https)\:\/\/)?([^"]*)"/', 'href="http://$1"', $text);
答案 2 :(得分:1)
C#
result = new Regex("(href=\")([^(http|https|ftp)])", RegexOptions.IgnoreCase).Replace(input, "href=\"//$2");
答案 3 :(得分:0)
如果您不关心可能搞乱本地链接,并且您始终可以保证字符串是完全合格的域名,那么您只需使用contains方法:
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
请记住,这有关于检查添加中应使用哪种协议以及网址是否相对的漏洞很多。
编辑:我特意选择不提供RegEx解决方案,因为这是一个简单的检查,RegEx对它来说有点重(IMO)。