网站地址验证的正则表达式

Off*_*'er 4 .net c# regex data-annotations

我有一个用户输入来提供网站地址,显然大多数用户不知道什么是格式良好的网址,因此我寻找一个遵循以下规则的网站地址正则表达式:

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

我使用这个正则表达式

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

但这是没有用的,因为它几乎允许所有字符串通过。

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

Uri.IsWellFormedUriString
Run Code Online (Sandbox Code Playgroud)

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

Gab*_*uci 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})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$
Run Code Online (Sandbox Code Playgroud)

(旁注:我注意到你的正则表达式 allowed 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
Run Code Online (Sandbox Code Playgroud)

源代码的注释中确实说:

此属性提供与 jquery validate 等效的服务器端 url 验证,因此共享相同的正则表达式。有关示例,请参阅单元测试。