允许相对和绝对url的Javascript url验证
我正在尝试验证一个字段以允许相对和绝对URL。我使用的是来自的正则表达式,但它允许在url中使用空格允许相对和绝对url的Javascript url验证,javascript,regex,url-validation,Javascript,Regex,Url Validation,我正在尝试验证一个字段以允许相对和绝对URL。我使用的是来自的正则表达式,但它允许在url中使用空格 var urlRegex = new RegExp(/(\/?[\w-]+)(\/[\w-]+)*\/?|(((http|ftp|https):\/\/)?[\w-]+(\.[\w-]+)+([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?)/gi); 例如: // this should work this/will/work.as
var urlRegex = new RegExp(/(\/?[\w-]+)(\/[\w-]+)*\/?|(((http|ftp|https):\/\/)?[\w-]+(\.[\w-]+)+([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?)/gi);
例如:
// this should work
this/will/work.aspx?say=hello
http://www.example.com/this/will/work.aspx?say=hello
// this shouldn't work but does
and/this will also work/even though it shouldn't
and/this-shouldn't/but it does/also
下面的代码是我最初用来验证绝对URL的代码,它工作得非常好。如果我没记错的话,我是从jquery源代码中提取的。如果这可以修改为也接受相对网址,那将是完美的,但这是我的联盟
var urlRegex = new RegExp(/^(https?|ftp):\/\/(((([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})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i);
我认为您只需要锚定模式,使其与整个字符串匹配:
var urlRegex = /^(\/?[\w-]+)(\/[\w-]+)*\/?|(((http|ftp|https):\/\/)?[\w-]+(\.[\w-]+)+([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?)$/gi;
前导的^
和尾随的$
意味着模式必须匹配整个字符串,而不仅仅是其中的一部分
尽管如此,该模式还有其他问题。首先,那些&
(&;
)的HTML实体只需要是“&”。斜杠不需要在[]
组中转义,我们也不需要“g”后缀。这就给我们留下了:
var urlRegex = /^(?:(\/?[\w-]+)(\/[\w-]+)*\/?|(((http|ftp|https):\/\/)?[\w-]+(\.[\w-]+)*([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?))$/i;
再次编辑-oops还需要包装整个内容。我认为您只需要锚定模式,使其与整个字符串匹配:
var urlRegex = /^(\/?[\w-]+)(\/[\w-]+)*\/?|(((http|ftp|https):\/\/)?[\w-]+(\.[\w-]+)+([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?)$/gi;
前导的^
和尾随的$
意味着模式必须匹配整个字符串,而不仅仅是其中的一部分
尽管如此,该模式还有其他问题。首先,那些&
(&;
)的HTML实体只需要是“&”。斜杠不需要在[]
组中转义,我们也不需要“g”后缀。这就给我们留下了:
var urlRegex = /^(?:(\/?[\w-]+)(\/[\w-]+)*\/?|(((http|ftp|https):\/\/)?[\w-]+(\.[\w-]+)*([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?))$/i;
再次编辑-oops还需要对整个内容进行包装。我写了一篇关于URI验证的文章,其中包含了所有各种URI组件的代码片段,如以下所述:
你可以在那里找到你想要的东西。但是请注意,几乎任何字符串都表示有效的URI—即使是空字符串 我写了一篇关于URI验证的文章,其中包含了所有不同URI组件的代码片段,如下所述:
你可以在那里找到你想要的东西。但是请注意,几乎任何字符串都表示有效的URI—即使是空字符串 在这些示例中,您根本不需要调用RegExp构造函数。您是说我可以这样做<代码>var urlRegex=/…/代码>对吗?是的-等等,我想我有一个答案。在这些示例中,您根本不需要调用RegExp构造函数。您是说我可以这样做<代码>var urlRegex=/…/代码>对吗?是的-等等,我想我有答案了。我已经更新了模式。用正则表达式解析URL有点棘手。多亏了Pointy,就快到了。它不允许
/other/url.aspx
,但它允许other/url.aspx
以及绝对url。谢谢你的回答,我真的很感谢你的帮助。我想问题是分组有点不合适。“/other/url.aspx”部分不起作用,因为正则表达式的左侧部分不允许“.aspx”,而右侧允许。但是,右侧不允许使用前导斜杠。我认为我们需要的是一个与协议和主机匹配的右侧部分,然后在第一个“/”之前使整个组成为可选的,然后整个组也可以是可选的(对于“foo/bar.aspx”)。我已经更新了模式。用正则表达式解析URL有点棘手。多亏了Pointy,就快到了。它不允许/other/url.aspx
,但它允许other/url.aspx
以及绝对url。谢谢你的回答,我真的很感谢你的帮助。我想问题是分组有点不合适。“/other/url.aspx”部分不起作用,因为正则表达式的左侧部分不允许“.aspx”,而右侧允许。但是,右侧不允许使用前导斜杠。我认为我们需要的是与协议和主机相匹配的右侧部分,然后在第一个“/”之前使整个组成为可选的,然后整个组也可以是可选的(对于“foo/bar.aspx”)。我正在查看路径regex,但我很难让它在javascript中语法上工作@bflemi3-双击文章中的正则表达式,会弹出一个包含正确格式代码段的文本框。您可以通过下拉菜单选择Javascript语法。干杯。我正在查看路径正则表达式,但在javascript中语法上无法使用它@bflemi3-双击文章中的正则表达式,会弹出一个包含正确格式代码段的文本框。您可以通过下拉菜单选择Javascript语法。干杯