用于url验证的正则表达式(未终止的括号错误)

时间:2009-09-23 16:35:25

标签: javascript regex validation

我有以下表达式来验证URL,但它在浏览器上给出了语法错误。我不是正则表达式的专家,所以我不确定我在寻找什么。我也希望它测试http://和https:// urls。

"url":{
    "regex":"/^http\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(/\S*)?$/",
    "alertText":"URL must start with http://"}

编辑:

澄清我正在寻找正则表达式和语法问题的帮助。我根据所有答案尝试了大约20种不同的变化,但仍然没有运气。为了清楚起见,我不需要验证整个URL。我只需要验证它是以http://或https://开头的,但如果留空则不能验证失败。我可以使用这个

来获取http部分
/^https?:///

无需逃避/偶数。但是当我尝试输入字段为空时它会失败:

/^(https?://)?/ 

我收到错误消息“未终止的括号/ ^(https?://)/”。

只是为了混淆更多的问题,这是我昨天添加的用于验证日期或没有条目的内容,它与我的格式相同。

/^([0-9]{1,2}\-\[0-9]{1,2}\-\[0-9]{4})?$/

3 个答案:

答案 0 :(得分:2)

如果要测试URL或空输入,可能需要进行两次传递。

  1. 测试空字符串。
  2. 测试有效网址。
  3. 我会做类似以下的事情(假设urlString是我的输入)。

    // get rid of whitespace, in case user hit spacebar/tab
    // also removes leading/trailing spaces.
    urlString = urlString.replace(/[\s]*/g,'');
    
    // test if zero length string, if not, test the url.
    if( urlString.length > 0 ){  // test the URL
      var re = new RegExp( your_expression_goes_here );
      var result = re.exec(urlString);
      if( result != null ) {
        // we have a hit!!!  this is a URL.
      } else {
        // this is a bad string.
      }
    } else {
      // user entered no text, let's move on.
    }
    

    因此,前面应该可以工作并允许您测试空字符串或URL。对于正在使用“/(http | https):///”的正则表达式,我认为它有点缺陷。是的,它会捕获“ http:// ”或“ https:// ”,但它也会键入一个字符串,如“ htthttp:/ / “这显然不是你想要的。

    您的其他示例“/ ^(http | https):///”更好,因为它将从字符串的开头匹配,并告诉您字符串是否像URL一样开始。

    现在,我认为上面的jrob是关于测试完整URL的第二个字符串在正确的轨道上。我想我找到了他在this页面上使用的相同样本。我已经修改了下面的表达式,并使用在线正则表达式测试器对其进行了测试,因为我是新用户,所以无法发布链接:D。

    如果输入字符串以任何方式是无效的URL,它似乎捕获了一整行有效的URL并产生错误,至少对于我能想到的无效URL。它也只捕获http / https协议,我认为这是你的基本要求。

    ^(?:http(?:s?)\:\/\/|~/|/)?(?:\w+:\w+@)?(?:(?:[-\w]+\.)+([a-zA-Z]{2,9}))(?::[\d]{1,5})?(?:(?:(?:/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|/)+|\?|#)?(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?$
    

    希望这有帮助。

    更新了代码(两次)。

    我仍然强烈建议您按照我之前的示例首先测试空字符串,如果字符串不为零,则只测试有效值。我试图将两个测试合并为一个,但到目前为止还没有这样做(也许其他人仍然可以解决这个问题。)

    以下测试对我有用,这里是您需要的URL示例:

    //var re = /^(?:http(?:s?)\:\/\/)/;
    // the following expression will test for http(s):// and empty string
    var re = /^(?:http(?:s?)\:\/\/)*$/;
    // use the precompiled expression above, or the following
    // two lines:
    //var reTxt = "^(?:http(?:s?)\:\/\/)";
    //var re = new RegExp(reTxt);
    
    alert(
      "result:" + re.test("http://") +
    "\nresult:" + re.test("https://") +
    "\nresult:" + re.test("") +
    "\nresult:" + re.test("https:") +
    "\nresult:" + re.test("xhttp://") +
    "\nresult:" + re.test("ftp://") +
    "\nresult:" + re.test("http:/") +
    "\nresult:" + re.test("http://somepage.com") +
    "\nresult:" + re.test("httphttp://") +
    "\nresult:" + re.test(" http://") +
    "\nresult:" + re.test("Random text") 
    );
    

    这是对日期的测试:

    var re2 = /^[0-9]{1,2}\-[0-9]{1,2}\-[0-9]{4}$/;
    // use the precompiled expression above, or the following
    // two lines:
    //var reDateTxt = /^[0-9]{1,2}\-[0-9]{1,2}\-[0-9]{4}$/;
    //var re2 = new RegExp(reDateTxt);
    
    alert(
    "result:" + re2.test("02-02-2009") +
    "\nresult:" + re2.test("022-02-2009") + 
    "\nresult:" + re2.test("02-032-2009") + 
    "\nresult:" + re2.test("02-02-23009") + 
    "\nresult:" + re2.test("  02-02-2009") + 
    "\nresult:" + re2.test("02-0a2-2009") + 
    "\nresult:" + re2.test("02-02-2009") + 
    "\nresult:" + re2.test("Random text") 
    );
    

答案 1 :(得分:2)

以下是the spec on URIs,其中的网址是子集,如果您确定所有关注的内容,则此处为the spec on URLs。只使用一个正则表达式,完全实现其中任何一个都是不可能的。

如果您确实要验证URL,您知道的URL将是HTTP或HTTPS,请向其发送HTTP HEAD请求并检查响应代码。

或者,如果您打算使用规范,请确定您愿意接受输入的宽松程度,以及排除有效URL或允许错误URL更好。

答案 2 :(得分:2)

对于它的价值,语法错误是未转义的正斜杠: / \S*

编辑:哦,哇,我累了。所有正斜杠都没有转义。您可以使用反斜杠来逃避它们:\/