【问题标题】:Using RegEX to match URL pattern, invalid quantifier?使用 RegEX 匹配 URL 模式,量词无效?
【发布时间】:2011-07-13 02:02:21
【问题描述】:

我正在尝试使用 RegEX 来匹配 URL 模式。我在这里找到了答案: Check if a Javascript string is a url

这将我指向这里: http://forums.devshed.com/javascript-development-115/regexp-to-match-url-pattern-493764.html

这给了我以下代码(从 devshed 剪切并粘贴到这里和我的脚本):

function ValidURL(str) {
   var pattern = new RegExp('^(https?:\/\/)?'+ // protocol
      '((([a-z\d]([a-z\d-]*[a-z\d])*)\.)+[a-z]{2,}|'+ // domain name
      '((\d{1,3}\.){3}\d{1,3}))'+ // OR ip (v4) address
      '(\:\d+)?(\/[-a-z\d%_.~+]*)*'+ // port and path
      '(\?[;&a-z\d%_.~+=-]*)?'+ // query string
      '(\#[-a-z\d_]*)?$','i'); // fragment locater
   if(!pattern.test(str)) {
      alert("Please enter a valid URL.");
      return false;
   } else {
      return true;
   }
}

当我尝试在 Firefox 4.0 中使用它时,Firebug 1.7.3 给我一个无效的量词错误:

      '(\#[-a-z\d_]*)?$','i'); // fragment locater

有人知道问题可能是什么吗?

从对无效量词的其他搜索中,我认为 * 是一个问题,但不确定它可能是什么。当它给我错误时,我正在使用该函数的有问题的字符串是:

htp://localhost:1987/

添加评论 agent-j 建议的修复至少消除了无效量词问题。 赞一个

但是,如果正确完成,它不喜欢上面的示例网址:

    http://localhost:1987/

问题出在端口上。当我删除端口号时,它喜欢 localhost。

【问题讨论】:

  • 您需要解决的一件事是,当您从这样的字符串形成正则表达式时,您需要引用的内容与形成带有正则表达式文字语法的正则表达式。具体来说,您不需要在“/”字符之前使用“\”,但您确实需要在“d”或“ ?”。
  • 另外,错误的行号可能并不有趣,因为在调用“RegExp()”函数并解析表达式之前,不会检测到实际错误。事实上,问题可能不在于正则表达式的最后一部分。
  • @Pointy,关于错误位置没有给出正确位置的非常好的观点。

标签: javascript regex


【解决方案1】:

我用这个,它似乎工作得很好:

var re = /^(http[s]?:\/\/){0,1}(www\.){0,1}[a-zA-Z0-9\.\-]+\.[a-zA-Z]{2,5}[\.]{0,1}/;
var isUrl = re.test(message);

【讨论】:

    【解决方案2】:

    你需要在这里转义第一个\

    '(\?[;&a-z\d%_.~+=-]*)?'
    

    变成

    '(\\?[;&a-z\d%_.~+=-]*)?'
    

    【讨论】:

    • 这去掉了无效的量词。现在它不会接受上面的示例字符串:/
    • 我不确定您的正则表达式还有什么问题,但至少,正则表达式当前需要 IPv4 地址或域后缀(.com、.net、.us)等. 还有其他问题,虽然我无法确定。
    • 所有正则表达式中的反斜杠引号除了“/”字符之前的那些需要加倍。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多