任何人都想尝试提出一个与之匹配的正则表达式:
我认为用一个正则表达式做这件事可能是不可能的,但你永远不会知道。
编辑:澄清一下,我要做的是从文档中挑选出所有URI(不是HTML文档)。
答案 0 :(得分:8)
(
((http|https|ftp)://([\w-\d]+\.)+[\w-\d]+){0,1} // Capture domain names or IP addresses
(/[\w~,;\-\./?%&+#=]*) // Capture paths, including relative
)
这个答案的基本原理:
注意事项:
编辑:哎呀,修复了关闭问题。
答案 1 :(得分:2)
(http:\/)?(\/[\w\.\-]+)+\/?
与Alex的相似。
答案 2 :(得分:2)
这是一个棘手的问题,因为URL中有这么多有效字符(在它们被编码之前)。
这是我的镜头:
(http:/|https:/)?(/[^\s"'<>]+)+/?
也与亚历克斯相似。我发现亚历克斯唯一的问题是,它不会像英镑符号,破折号等类似的东西。而我的将匹配所有这些。
编辑 - 实际上,唯一让它不要过于贪婪的事情就是不要匹配空格,引号,撇号或者V形符号的指令。
答案 3 :(得分:1)
(http:/)?(/[\w.]+)+/?
匹配这些,但也许你有更严格的条件?
答案 4 :(得分:0)
不容易,你最终可能会抓住“太多的URI”,但是:
((http://|https://)([^/])+)*(/([^\s])*(/))(((\w)*\.[\w]{3,10})|(\w+))?
基本上你有几个小组。关于定义协议。一个是寻找目录,一个是在最后寻找一个文件。但!这种方法非常有限。如果您需要真正的URI验证并且!分离(端口,用户名,密码,过滤掉不需要的字符!)你可能最终得到一种更复杂的表达方式。祝你好运!
<强>更新强>
你没有要求这个,但是对于那些来自搜索引擎的人想要了解更多有关正则表达式的信息,我想插入我用于此次尝试的免费程序“The Regex Coach”(不,不是附属的) )。
答案 5 :(得分:0)
我使用了命名捕获组。当方案存在时,我们得到更好的匹配。像www.foo.com/bar只会匹配/ bar。
(?:
(?:(?<scheme>https?|file)://)
(?<host>[^/]+)
(?<path>/(?:[^\s])+)?
)
|
(?<path>/(?:[^\s])+)
这是你可以为javascript做的事情
var result = text.match(/(?:(?:(https?|file):\/\/)([^\/]+)(\/(?:[^\s])+)?)|(\/(?:[^\s])+)/g);
测试数据
sadfasdf /foo/bar/ba090z.gif asdfasdf /foo/bar/ sadfasdf asdflkj; http://www.foo.com/foo/bar some stuff http://user:pw@www.foo.com:80/r?stuff%20stuff
user:pw@www.foo.com:80/r?stuff%20stuff