正则表达式检测语法正确的 URL [重复]

Posted

技术标签:

【中文标题】正则表达式检测语法正确的 URL [重复]【英文标题】:RegEx to detect syntactically correct URL [duplicate] 【发布时间】:2011-07-19 14:31:54 【问题描述】:

我使用 Asp.net 4 和 C# Web 表单。

在我的 Web 应用程序中,用户可以使用文本框添加 URL。

我需要确保插入的每个值都有一个语法正确的 URL 格式(我不需要检查 URL 是否真的存在)。

因此,作为第一条规则,我想使用CustomValidator Control 检查用户插入的输入是否在开头具有值字符串“http://”。

我的问题?

您能否为我提供一个正则表达式以添加到我的 CustomValidator 控件中,它只允许传递以“http://”开头的字符串?

您还有其他使用 RegEx 的规则来建议我吗?

检测语法正确的 URL 的最佳做法是什么?

感谢您的帮助

【问题讨论】:

【参考方案1】:
Regex regx = new Regex("http://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?", RegexOptions.IgnoreCase);

【讨论】:

@stema:真的吗?你有tried吗? @O.R.Mapper,我不需要。这肯定不是我评论的正则表达式。这个正则表达式错误得多。 @stema:我很困惑。根据 SO 显示的内容,此答案尚未被编辑。 @O.R.Mapper,我知道。在 5 分钟内,编辑不会显示为编辑。但我的第一条评论是在那 5 分钟之后。我很抱歉,但我不记得三年前发生了什么。但我确信我可以看到需要以“www”开头的模式。当前模式甚至会将“http://+”匹配为有效 URL。【参考方案2】:

在我(有限的)经验中,正则表达式会浪费大量资源来完成这样一个简单的任务(字符串以 http:// 或 https:// 开头)

您可能需要考虑检查网址是否包含“非法”字符。 about urlencoding

【讨论】:

【参考方案3】:

一种在许多方面更简单且对以后更改更灵活的方法是尝试并查看:

public static bool IsValidHttpUri(string uriString)

  Uri test = null;
  return Uri.TryCreate(uriString, UriKind.Absolute, out test) && test.Scheme == "http";
)

使用Uri.IsWellFormedUriString 更容易,但不会检查您的 URI 必须是 HTTP 的要求。

编辑:哦,这是否认为 IRI 有效取决于配置,请参阅http://msdn.microsoft.com/en-us/library/system.uri.aspx 的“国际资源标识符支持”部分@ 通常,您是否希望它们被视为有效将匹配此配置无论如何设置,所以这在大多数情况下实际上是一个好处。

【讨论】:

谢谢约翰,我真的很喜欢你的方法。你知道为什么尝试 TryCreate 为“mail:foo”之类的 URI 返回 TRUE 吗?在 Uri msdn.microsoft.com/en-us/library/system.uri.scheme.aspx 的 msdn 架构支持上,但我找不到解释......也许是一个错误?? Uri 支持任何方案,包括那些尚未发明的方案。毕竟,您可能会在构建 .NET 之后实现一个方案,因此 Uri 类需要足够灵活。请注意,您链接到的页面显示“此属性并不表示用于初始化 Uri 实例的方案已被识别”。并且该表只是“一些可能的值”。 我不相信这个解决方案。 Uri 类愉快地接受诸如 http://------/ 之类的 URI,然后其他软件(与语义 Web 相关)会阻止它,声称这是一个格式错误的 URI。 我同时意识到其他软件使用的 URI 语法比当前认为有效的语法更旧 - 所以我想指定此解决方案仅在需要处理 URI 的目标软件使用与 .NET 的 Uri 类相同的 URI 语法版本。 @ORMapper 我现在无法尝试,但我注意到您提供的 URI 示例是有效的 URI,但不是有效的 IRI(适当的 RDF 和其他 Sem-Web 内容)使用 IRI 比它们之前的早期网络内容更现代)。根据我在答案中链接到的页面,<idn enabled="All" /><iriParsing enabled="true" /> 设置是否可以解决您的问题?如文档所述,我会说Uri.TryCreate 应该接受没有这些设置的 URI,并且 不应该使用它们。

以上是关于正则表达式检测语法正确的 URL [重复]的主要内容,如果未能解决你的问题,请参考以下文章

python使用正则表达式检测给定的URL地址是否合法

修改正则表达式以在带有或不带有 http 前缀的字符串中查找 URL [重复]

检测Python中字符串内URL的最佳正则表达式

如何用正则表达式检测ip是不是正确,求详解

正则表达式检测代码中的注释[重复]

用于检测URL的正则表达式