【问题标题】:Regular Expression to match URLs / web addresses正则表达式匹配 URL/网址
【发布时间】:2012-06-29 10:30:30
【问题描述】:

我有一个 JS 函数,它传递了一个运行正则表达式的字符串,并返回任何匹配项:

searchText= // some string which may or may not contain URLs
Rxp= new RegExp("([a-zA-Z\d]+://)?(\w+:\w+@)?([a-zA-Z\d.-]+\.[A-Za-z]{2,4})(:\d+)?(/.*)?/ig")
return searchText.match(Rxp);

RegExp 应返回以下任何(和类似的派生)的匹配项:

但是,没有这样的运气。有什么建议吗?

【问题讨论】:

  • 我知道这不是一个答案,但我建议你看看这个网站:daringfireball.net/2010/07/improved_regex_for_matching_urls
  • 如果你想通过它应该匹配的东西来指定一个正则表达式,它会帮助说出它不应该匹配的模式。
  • 我见过勇敢的火球,但它不匹配,例如'google.com'
  • @ErgoSummary 是的,因为它不应该。例如,如果你写“大家好。你好吗?”它将被转换为“嗨all.how是你吗?”在此处查看完整说明:stackoverflow.com/a/10505843/1365010(请注意,stackoverflow 也与 google.com 不匹配)
  • @ErgoSummary 如果您确实需要匹配它,请参阅此答案中的正则表达式stackoverflow.com/a/10505843/1365010

标签: javascript regex


【解决方案1】:

在字符串中,\ 必须转义:\\

首先,字符串被解释。 \w 转入w,因为它没有任何意义。
然后,将解析后的字符串转入正则表达式。但是\在字符串解析过程中丢失了,所以你的正则表达式会中断。

不要使用RegExp 构造函数,而是使用正则表达式:

Rxp = /([a-zA-Z\d]+:\/\/)?(\w+:\w+@)?([a-zA-Z\d.-]+\.[A-Za-z]{2,4})(:\d+)?(\/.*)?/ig;
// Note: I recommend to use a different variable name. Variables starting with a
//  capital usually indicate a constructor, by convention.

如果您不能 100% 确定输入是字符串,最好使用 exec 方法,它将参数强制转换为字符串:

return Rxp.exec(searchText);

这是一个包含查询字符串和 URL 片段的模式:

/([a-zA-Z\d]+:\/\/)?(\w+:\w+@)?([a-zA-Z\d.-]+\.[A-Za-z]{2,4})(:\d+)?(\/[^?#\s]*‌)?(\?[^#\s]*)?(#\S*)?/ig

【讨论】:

  • 另外,最后的/ig 不会按预期工作。最好使用正则表达式文字。
  • +1 表示文字。但是,现在您必须转义正则表达式中的斜线。
  • 非常感谢,这看起来是一个巨大的改进 - 对于以 '?querystring=value' 结尾的匹配项(即 URL 查询字符串),返回值中省略了该部分?
  • @ErgoSummary 是否要包含查询字符串?使用类似于(\?[^#\s]+)? 的内容(假设您的网址在空格开始的地方结束)。
  • @ErgoSummary 模式中有一个不可见的字符。 /([a-zA-Z\d]+:\/\/)?(\w+:\w+@)?([a-zA-Z\d.-]+\.[A-Za-z]{2,4})(:\d+)?(\/[^?#\s]*)?(\?[^#\s]*)?(#\S*)?/ig.exec('http://www.regexplanet.com/advanced/javascript/index.html') 工作正常。编辑:再次。我会将模式添加到我的答案中。
【解决方案2】:

首先,没有必要通过 RegExp 构造函数创建模式,因为它不包含任何动态内容。您可以只使用文字 /pattern/

如果你确实使用了构造函数,你必须记住你的模式被声明为一个字符串,而不是一个文字 REGEXP,所以你需要双转义特殊字符,例如\\d,不是\d。此外,还有几个正斜杠你根本没有转义。

使用构造函数,修饰符 (g, i) 作为第二个参数传递,而不是附加到模式中。

所以要从字面上改变你所拥有的,那就是:

Rxp= new RegExp("([a-zA-Z\\d]+:\\/\\/)?(\\w+:\\w+@)?([a-zA-Z\\d.-]+\\.[A-Za-z]{2,4})(:\\d+)?(\\/.*)?", "ig")

但更好的是:

Rxp = /([a-zA-Z\d]+:\/\/)?(\w+:\w+@)?([a-zA-Z\d.-]+\.[A-Za-z]{2,4})(:\d+)?(\/.*)?/gi;

【讨论】:

  • RegExp 构造函数中,不需要转义斜线。仅在正则表达式文字中。
  • 啊,我从来没有意识到这一点,谢谢。猜猜这样做并没有什么坏处,只是没有任何效果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多