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

标签 c# .net regex data-annotations

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

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; }

但它没有用,因为它几乎允许每个字符串通过。

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

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

最佳答案

有一个 UrlAttribute 验证 URL,但它确实强制执行协议(protocol),这似乎是您不想要的。

但是,源代码是可用的,它确实 use a regular expression你可以窃取和修改。仅将协议(protocol)部分修改为您想要的可选方式,您会得到:

^((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

comments of the source code它确实说:

This attribute provides server-side url validation equivalent to jquery validate, and therefore shares the same regular expression. See unit tests for examples.

关于c# - 网站地址验证的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57910618/

相关文章:

c# - AutoMapper Include 未按预期工作?

c# - T-SQL 查询超时/性能问题

c# - 为什么 Request.InputStream 包含额外的字节?

Javascript多行正则表达式先行或字符串的其余部分/字符串的最末尾

c# - .NET Core 2.2 Razor Pages 网站模板以及如何缓存 MSFT Graph 调用

java - 如何在java中解密C#加密的AES字符串

c# - 在保护 WCF 服务方面需要帮助

c# - 使用 entityframeworkprovider 在 .net 中查询立方体的度量

python - sub ('a*|b' , '' , 'bcd' ) -> bcd WAT?

regex - 如何在 perl 中使用正则表达式计算文件中的中文单词?