正则表达式用于验证网站地址

4

我有一个用户输入,用于提供网站地址。显然,大多数用户不知道什么是格式良好的URL,因此我需要一个符合以下规则的网站地址Regex:

1) www.someaddress.com - True
2) someaddress.com - True
3) http://someaddress.com - True
4) https://someaddress.com - True
5) https://www.someaddress.co.il - True
6) http://www.someaddress.com - True

我使用这个Regex:

[RegularExpression(@"^((http|ftp|https|www)://)?([\w+?\.\w+])+([a-zA-Z0-9\~\!\@\#\$\%\^\&\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]*)?$", ErrorMessage = "Not a valid website address")]
public string SiteUrl { get; set; }

但这是无用的,因为它允许几乎任何字符串通过。

请提供一个数据注释答案,而不是诸如以下内容的答案:

Uri.IsWellFormedUriString

因为 .net 不支持自定义属性的客户端验证。
1个回答

5

有一个UrlAttribute用于验证URL,但它不强制要求协议存在,而这似乎不是你想要的。

然而,源代码是可用的,并且它使用正则表达式,你可以借鉴并修改。只需将协议部分修改为可选项,你就会得到这个:

^((http|ftp|https)://)?(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$

(旁注:我注意到你的正则表达式允许www://,这很可疑。在这里我已将其删除,但如果你确实需要它,那么你可以添加它。)
这些是我测试过的值:
www.someaddress.com             Yes
someaddress.com                 Yes
http://someaddress.com          Yes
https://someaddress.com         Yes
https://www.someaddress.co.il   Yes
cow                             No
hi hello.com                    No
this/that.com                   No

源代码的注释中确实提到:

该属性提供了服务器端的url验证,相当于jquery validate,并且使用相同的正则表达式。请参阅单元测试以获取示例。


1
不想表现得很刻薄,但是那个组里的 www 是错误的。它会接受 www://google.com。除此之外,这是一个非常好的正则表达式。 - André Silva
是的,我从问题中的正则表达式中获取了它,并在我的答案中就该正则表达式进行了评论。虽然并不一定是错误的,因为你可以为任何东西创建自定义协议处理程序(甚至 web+burger:),但这确实有些可疑。 - Gabriel Luci
哈哈哈,我喜欢在SO评论中让自己尴尬。该死..刚才我注意到我评论了答案...我应该多读几遍问题。谢谢提醒哈哈。 - André Silva
1
也许我应该将其删除,以防人们在以后盲目地复制/粘贴。 - Gabriel Luci
@GabrielLuci 我最初使用了 Url 数据注释,但它包含了 http 部分,对于正则表达式和源代码链接的加一赞 :) - Offir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接