JavaScript中最短的URL正则表达式匹配


16

创建最短的正则表达式,以在JavaScript中运行时与文本中的URL大致匹配

例:

"some text exampley.com".match(/your regular expression goes here/);

正则表达式需要

  • 捕获用于http和https的所有有效URL。
  • 不必担心与实际上不是有效URL的URL查找字符串不匹配 super.awesome/cool
  • 作为JavaScript正则表达式运行时有效

测试标准:

比赛:

不匹配:

  • 超酷
  • 早上好
  • 我可以
  • 你好。

这是一个测试,可能有助于澄清一下http://jsfiddle.net/MikeGrace/gsJyr/

对于缺乏清晰性,我深表歉意,但我没有意识到匹配URL多么糟糕。


Ahgrrrr!我错过了编辑权限!我打算将游戏限制为一种语言,也许您应该用该语言标记它。
dmckee ---前主持人小猫,

什么构成有效的URL字符?因为我可以简单地\w用于所有内容,您是否希望对不同的URL组件进行反向引用?
Ming-Tang

1
根据RFC 2396,“ URI是一组非常有限的字符序列,即基本拉丁字母,数字和一些特殊字符的字母。”
RunnerRick 2011年

迈克:我想仍然需要一些澄清。就目前而言,我只能将其/:/用作正则表达式并匹配有效的URI,而不匹配»Not match«列表上的所有示例。只要走那条路,就只是一个问题:什么是最短的正则表达式,它将不匹配任何示例字符串,但仍捕获所有URI。
乔伊,

1
只是尝试写一个更长的挑战,了解更多细节。

Answers:


1
/.+\.\w\w.*/

不匹配不应该匹配的3个字符串,匹配几乎所有其他;)
upd:仍然不匹配所有5 个字符串


14

这个作品:

var re = /(^|\s)((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)/gi;

/*
(^|\s)                            : ensure that we are not matching an url 
                                    embeded in an other string
(https?:\/\/)?                    : the http or https schemes (optional)
[\w-]+(\.[\w-]+)+\.?              : domain name with at least two components;
                                    allows a trailing dot
(:\d+)?                           : the port (optional)
(\/\S*)?                          : the path (optional)
*/

通过考试 http://jsfiddle.net/9BYdp/1/

还匹配:

  • example.com。(尾点)
  • example.com:8080(端口)

甜蜜!!!!!!!!!
Mike Grace

2
您是否也要只将一个主机名与一个组件(例如localhost)匹配?
RunnerRick 2011年

这允许有空间
brenjt

为我工作。ty :)

效果很好,但不适用于具有用户名/密码部分的域,例如http://user:password@domain.com/path
Radon8472 '18

5

显然,这没有达到您的预期目的,但是符合您的条件:

 /.*/
  • “匹配用于http和https的所有有效URL。”

    是的,一定会匹配。

  • “不必担心与实际上不是有效URL(例如'super.awesome / cool')的URL查找字符串不匹配”

    是的,肯定会有很多误报,但是您说没关系。

  • 作为JavaScript正则表达式运行时有效

    就像鸡蛋所说的那样,确保它能正常工作。

如果此结果不是正确的答案,则您需要对标准进行更多选择。

为了,它作为你想,你实际上是一个规则需要实现一个完全符合RFC的匹配器,并且完全符合RFC的匹配器将“担心不匹配”。

因此,就“许可证不匹配”而言,您需要准确指定允许与RFC的哪些偏离。

其他任何事情,整个过程都是虚假的,因为人们只会写对他们有用的东西,或者他们喜欢它的方式,然后牺牲“任何意义”来支持做短(就像我一样)。

关于您的更新

到目前为止,我能想到的最简单的正则表达式可以匹配(捕获)您所有已粘贴的示例:

/(\S+\.[^/\s]+(\/\S+|\/|))/g;

它本质上非常简单,并且假设只有3种基本形式是可能的。

x.y
x.y/
x.y/z 

z可以不是空格。 x可以是非空格的任何内容。 y可以是非空格或'/'字符的任何内容。

很多事情都适用于此规则,很多事情,但是它们至少看起来像是对人类有效的URI,只是与规范不兼容。

例如:

hello.0/1  # valid 
1.2/1 # valid 
muffins://¥.µ/€  # probably valid

我认为理智的方法是提取可能是URI的内容,然后使用更严格的内容对其进行验证,我正在研究如何使用浏览器URI类来验证它们=)。

但是您可以在这里看到以上对这个示例进行的推理:http : //jsfiddle.net/mHbXx/


他改变了问题,但是/:/即使编辑后,您仍然可以做得更好:-)
Joey

谢谢迈克=)。我不想以更严肃的方式竞争自己,其他建议则更有用,我只是想指出最初前提的问题,以便提高问题的质量=)
肯特·弗雷德里克

是只有我还是这个匹配的“ www .google .com”?
Schiavini 2012年

1
/https?\:\/\/\w+((\:\d+)?\/\S*)?/

试试看

我包括了分隔正则表达式的前后斜杠,因此希望这不会影响我的字符数!

此模式将协议限制为http或https,允许使用可选的端口号,然后允许除空格之外的任何字符。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.