任何人都想尝试自己的手来提出一个正则表达式,以匹配:
我想用一个正则表达式可能做不到,但你永远不知道。编辑:澄清一下,我试图做的是从一个文档(不是HTML文档)中挑选出所有的URI。
ifmq2ha21#
( ((http|https|ftp)://([\w-\d]+\.)+[\w-\d]+){0,1} // Capture domain names or IP addresses (/[\w~,;\-\./?%&+#=]*) // Capture paths, including relative )
此回答的依据:1.整个内容被分组,以便您可以挑选出整个URL1.协议部分是可选的,但如果提供了,则还应提供主机名或IP地址(这两个部分允许的字符数都比URI的其余部分少)。1.开头的“/”也是可选的。路径的格式可以是“images/1.gif”,相对于当前路径而不是相对于主机名。注意事项:1.不支持mailto和文件URI。1.后面有句点的URL(例如在没有引号的句子末尾)将包括末尾的句点。1.由于上面的第3条,它将捕获所有类型的内容,如果您可以验证所有路径都是 * 而不是 * 相对的,您可以在括号外添加一个“/”,从而要求它。1.如果所有URI都在HTML属性(A、LINK、IMG等)中,那么通过只在引号中捕获,或者至少只在HTML标记中捕获,可以更准确地定位URI。编辑:哎呀,修正了右括号的问题。
d8tt03nd2#
(http:/)?(/[\w.]+)+/?
符合这些,但也许你有更严格的条件?
vuktfyat3#
这是一个棘手的,因为有这么多的有效字符在网址的(之前,他们得到网址编码)。这是我的镜头:
(http:/|https:/)?(/[^\s"'<>]+)+/?
和Alex的也很相似。我发现Alex的唯一问题是它不能匹配磅符号、破折号之类的东西。而我的可以匹配所有这些。编辑--事实上,唯一能让它不太贪婪的是不匹配空格、引号、撇号或V形符号的指令。
7ivaypg94#
(http:\/)?(\/[\w\.\-]+)+\/?
和亚历克斯的差不多。
dz6r00yl5#
不容易,你可能最终有“太多的URI”捕获,但是怎么办:
((http://|https://)([^/])+)*(/([^\s])*(/))(((\w)*\.[\w]{3,10})|(\w+))?
基本上你有两个小组。定义协议。一个寻找目录,一个寻找末尾的文件。但是!这种方法是非常有限的。如果你需要一个真实的的URI验证和!分离(端口,用户名,密码,过滤掉不需要的字符!),你可能会得到一个更复杂的表达式。祝你好运!
更新日期:
你没有要求这个,但是对于那些来自搜索引擎想要了解更多关于regex的家伙,我想插入这个免费的程序,我用这个尝试“The Regex Coach“(不,不隶属).
yc0p9oo06#
我使用了命名捕获组。当方案存在时,我们会得到更好的匹配。就像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
w6lpcovy7#
我最近偶然发现了这一点,并有同样的要求,我发现这一个工作:^(https?:\/)?(\/[^\s"'<>]+)$正则表达式url解析肯定不容易,而且这个正则表达式不验证url模式,但至少它可以防止最简单的XSS攻击向量。
^(https?:\/)?(\/[^\s"'<>]+)$
7条答案
按热度按时间ifmq2ha21#
此回答的依据:
1.整个内容被分组,以便您可以挑选出整个URL
1.协议部分是可选的,但如果提供了,则还应提供主机名或IP地址(这两个部分允许的字符数都比URI的其余部分少)。
1.开头的“/”也是可选的。路径的格式可以是“images/1.gif”,相对于当前路径而不是相对于主机名。
注意事项:
1.不支持mailto和文件URI。
1.后面有句点的URL(例如在没有引号的句子末尾)将包括末尾的句点。
1.由于上面的第3条,它将捕获所有类型的内容,如果您可以验证所有路径都是 * 而不是 * 相对的,您可以在括号外添加一个“/”,从而要求它。
1.如果所有URI都在HTML属性(A、LINK、IMG等)中,那么通过只在引号中捕获,或者至少只在HTML标记中捕获,可以更准确地定位URI。
编辑:哎呀,修正了右括号的问题。
d8tt03nd2#
符合这些,但也许你有更严格的条件?
vuktfyat3#
这是一个棘手的,因为有这么多的有效字符在网址的(之前,他们得到网址编码)。
这是我的镜头:
和Alex的也很相似。我发现Alex的唯一问题是它不能匹配磅符号、破折号之类的东西。而我的可以匹配所有这些。
编辑--事实上,唯一能让它不太贪婪的是不匹配空格、引号、撇号或V形符号的指令。
7ivaypg94#
和亚历克斯的差不多。
dz6r00yl5#
不容易,你可能最终有“太多的URI”捕获,但是怎么办:
基本上你有两个小组。定义协议。一个寻找目录,一个寻找末尾的文件。但是!这种方法是非常有限的。如果你需要一个真实的的URI验证和!分离(端口,用户名,密码,过滤掉不需要的字符!),你可能会得到一个更复杂的表达式。祝你好运!
更新日期:
你没有要求这个,但是对于那些来自搜索引擎想要了解更多关于regex的家伙,我想插入这个免费的程序,我用这个尝试“The Regex Coach“(不,不隶属).
yc0p9oo06#
我使用了命名捕获组。当方案存在时,我们会得到更好的匹配。就像www.foo.com/bar只匹配/bar。
这就是你可以为javascript做的
试验数据
w6lpcovy7#
我最近偶然发现了这一点,并有同样的要求,我发现这一个工作:
^(https?:\/)?(\/[^\s"'<>]+)$
正则表达式url解析肯定不容易,而且这个正则表达式不验证url模式,但至少它可以防止最简单的XSS攻击向量。