【问题标题】:URL validation with or without http and www带有或不带有 http 和 www 的 URL 验证
【发布时间】:2014-08-27 15:46:32
【问题描述】:

所有的正则表达式都传入这个js fiddle

当我将此正则表达式移动到我的 asp.net 页面时,正则表达式验证器 #three、#seven 和 #eight 被视为无效。

ASP.net:

<asp:RegularExpressionValidator ID="RegularExpressionValidator8" ControlToValidate="txtHomePage"
                                                    runat="server" CssClass="StandardText" Display="Dynamic" SetFocusOnError="true"
                                                    ErrorMessage="Invalid URL" ValidationExpression="^(?!www | www\.)[A-Za-z0-9_-]+\.+[A-Za-z0-9.\/%&=\?_:;-]+$"></asp:RegularExpressionValidator>

JavaScript 代码:

function checkUrlTest(url){

    //   /^(?:(http|https|ftp):\/\/)?(?:[\w-]+\.)+[a-z]{2,6}(\/)?/i
    //  ^(?!www | www\.)[A-Za-z0-9_-]+\.+[A-Za-z0-9.\/%&=\?_:;-]+$

    var urlregex = new RegExp("^(?!www | www\.)[A-Za-z0-9_-]+\.+[A-Za-z0-9.\/%&=\?_:;-]+$")

            return urlregex.test(url);
        }
var one = "yahoo.com";
var two = "www.yahoo.com";
var three = "http://www.yahoo.com";  //fails on .net page
var four = "yahoo.org";
var five = "somesite.org"
var six = "www.somesite.org"
var seven = "http://somesite.org"    //fails on .net page
var eight = "https://www.somesite.org"   //fails on .net page
var nine = "somesite.org?case=1"

        alert(
            one + '===> ' + checkUrlTest(one) + "\n" +
            two + '===> ' + checkUrlTest(two) + "\n" +
            three + '===> ' + checkUrlTest(three) + "\n" +
            four + '===> ' + checkUrlTest(four) + "\n" +
            five + '===> ' + checkUrlTest(five) + "\n" +
            six + '===> ' + checkUrlTest(six) + "\n" +
            seven + '===> ' + checkUrlTest(seven) + "\n" +
            eight + '===> ' + checkUrlTest(eight) + "\n" +
            nine + '===> ' + checkUrlTest(nine)
        );

这里缺少什么我无法找到?

【问题讨论】:

  • 我猜是斜线//导致了问题 :-) 我不是正则表达式专家,但我认为根据经验 .NET 使用与原生 JavaScript 不同的正则表达式
  • \ 反斜杠出现在" 引号内时需要转义。
  • 您的^ 正在消除https?// 前缀:它在行首之后立即寻找www。见regex101.com/r/gU2mM3/1

标签: javascript asp.net regex validation


【解决方案1】:

^(www | www\.) 中的 ^ 锚点排除了前面包含 https? 的行。您可以选择使用非捕获组和? 来查找这些情况:

^(?:https?://|s?ftps?://)?(?!www | www\.)[A-Za-z0-9_-]+\.+[A-Za-z0-9.\/%&=\?_:;-]+$

这将匹配除最后两行之外的所有内容:

yahoo.com
www.yahoo.com
http://www.yahoo.com
yahoo.org
somesite.org
www.somesite.org
http://somesite.org
https://www.somesite.org
somesite.org?case=1

www somesite.org   // Space after 'www'
 www.example.com   // Leading space

regex101 example

【讨论】:

  • 谢谢,我在 jsfiddle 中解决了这个问题,而不是为什么它不能在 asp.net 页面上运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 2014-01-25
  • 2011-03-27
  • 1970-01-01
相关资源
最近更新 更多