regex 匹配相对和绝对URL的正则表达式

ngynwnxp  于 2023-03-13  发布在  其他
关注(0)|答案(7)|浏览(233)

任何人都想尝试自己的手来提出一个正则表达式,以匹配:

我想用一个正则表达式可能做不到,但你永远不知道。
编辑:澄清一下,我试图做的是从一个文档(不是HTML文档)中挑选出所有的URI。

ifmq2ha2

ifmq2ha21#

(
  ((http|https|ftp)://([\w-\d]+\.)+[\w-\d]+){0,1}  // Capture domain names or IP addresses
  (/[\w~,;\-\./?%&+#=]*)                // Capture paths, including relative
)

此回答的依据:
1.整个内容被分组,以便您可以挑选出整个URL
1.协议部分是可选的,但如果提供了,则还应提供主机名或IP地址(这两个部分允许的字符数都比URI的其余部分少)。
1.开头的“/”也是可选的。路径的格式可以是“images/1.gif”,相对于当前路径而不是相对于主机名。
注意事项:
1.不支持mailto和文件URI。
1.后面有句点的URL(例如在没有引号的句子末尾)将包括末尾的句点。
1.由于上面的第3条,它将捕获所有类型的内容,如果您可以验证所有路径都是 * 而不是 * 相对的,您可以在括号外添加一个“/”,从而要求它。
1.如果所有URI都在HTML属性(A、LINK、IMG等)中,那么通过只在引号中捕获,或者至少只在HTML标记中捕获,可以更准确地定位URI。
编辑:哎呀,修正了右括号的问题。

d8tt03nd

d8tt03nd2#

(http:/)?(/[\w.]+)+/?

符合这些,但也许你有更严格的条件?

vuktfyat

vuktfyat3#

这是一个棘手的,因为有这么多的有效字符在网址的(之前,他们得到网址编码)。
这是我的镜头:

(http:/|https:/)?(/[^\s"'<>]+)+/?

和Alex的也很相似。我发现Alex的唯一问题是它不能匹配磅符号、破折号之类的东西。而我的可以匹配所有这些。
编辑--事实上,唯一能让它不太贪婪的是不匹配空格、引号、撇号或V形符号的指令。

7ivaypg9

7ivaypg94#

(http:\/)?(\/[\w\.\-]+)+\/?

和亚历克斯的差不多。

dz6r00yl

dz6r00yl5#

不容易,你可能最终有“太多的URI”捕获,但是怎么办:

((http://|https://)([^/])+)*(/([^\s])*(/))(((\w)*\.[\w]{3,10})|(\w+))?

基本上你有两个小组。定义协议。一个寻找目录,一个寻找末尾的文件。但是!这种方法是非常有限的。如果你需要一个真实的的URI验证和!分离(端口,用户名,密码,过滤掉不需要的字符!),你可能会得到一个更复杂的表达式。祝你好运!

更新日期:

你没有要求这个,但是对于那些来自搜索引擎想要了解更多关于regex的家伙,我想插入这个免费的程序,我用这个尝试“The Regex Coach“(不,不隶属).

yc0p9oo0

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
w6lpcovy

w6lpcovy7#

我最近偶然发现了这一点,并有同样的要求,我发现这一个工作:
^(https?:\/)?(\/[^\s"'<>]+)$
正则表达式url解析肯定不容易,而且这个正则表达式不验证url模式,但至少它可以防止最简单的XSS攻击向量。

相关问题