php - 匹配给定模式并以可选数字结尾的正则表达式
问题描述
我一直在尝试使用正则表达式来匹配和提取 URL 的一部分。URL 模式如下所示:
http://domain.abcdef/xyz/fe/fi/fo5/fu2m/123/
我打算捕获以下群体:
- 匹配和捕获
xyz
(可选,但具体值) - 匹配和捕获
fe/fi/fo5/fu2m
(必须存在,任意值) - 匹配和捕获
123
(可选数值,必须出现在末尾)
以下是我尝试过的表达式和遇到的问题:
字符串1:http://domain.abcdef/xyz/fe/fi/fo5/fu2m/123/
字符串2:http://domain.abcdef/xyz/fe/fi/fo5/fu2m/
^(?:https?:\/\/)?(?:[\da-z\.-]+)\.(?:[a-z\.]{2,6})(?:\/(xyz))?\/([\/\w]+)+(?:\/([\d]+))\/$
使最后的数字成为强制性
匹配并捕获 string1 中所需的所有组,即使
xyz
不包括在内string2 中没有匹配项,因为末尾没有数字
^(?:https?:\/\/)?(?:[\da-z\.-]+)\.(?:[a-z\.]{2,6})(?:\/(xyz))?\/([\/\w]+)+(?:\/([\d]+))?\/$
使末尾的数字可选
仅捕获 string1 和 string2 中的第 1 组和第 2 组。数字与 string2 中的第 2 组匹配为
fe/fi/fo5/fu2m/123
我的问题是如何在所有场景中捕获组 1、2 和 3,包括。string1 和 string2(注意:我使用的是 PHP 的preg_match
函数)
解决方案
使用修改后的 URL 验证器。
'~^(?!mailto:)(?:(?:https?|ftp)://)?(?:\S+(?::\S*)?@)?(?:(?:(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))|localhost)(?::\d{2,5})?(?:/(xyz))?((?:/(?!\d+/?$)[^/]*)+)(?:/(\d+))?/?\s*$~'
第 1 组是可选的xyz
第 2 组是必需的 中间
第 3 组是可选的数字在末尾
可读版本
^
(?! mailto: )
(?:
(?: https? | ftp )
://
)?
(?:
\S+
(?: : \S* )?
@
)?
(?:
(?:
(?:
[1-9] \d?
| 1 \d\d
| 2 [01] \d
| 22 [0-3]
)
(?:
\.
(?: 1? \d{1,2} | 2 [0-4] \d | 25 [0-5] )
){2}
(?:
\.
(?:
[1-9] \d?
| 1 \d\d
| 2 [0-4] \d
| 25 [0-4]
)
)
| (?:
(?: [a-z\u00a1-\uffff0-9]+ -? )*
[a-z\u00a1-\uffff0-9]+
)
(?:
\.
(?: [a-z\u00a1-\uffff0-9]+ -? )*
[a-z\u00a1-\uffff0-9]+
)*
(?:
\.
(?: [a-z\u00a1-\uffff]{2,} )
)
)
| localhost
)
(?: : \d{2,5} )?
(?:
/
( xyz ) # Optional specific value
)?
( # Must exist, arbitrary value
(?:
/
(?! \d+ /? $ ) # Not a numeric value at the end
[^/]*
)+
)
(?:
/
( \d+ ) # Optional numeric value, which must appear at the end
)?
/?
\s*
$
输出
** Grp 0 - ( pos 0 : len 46 )
http://domain.abcdef/xyz/fe/fi/fo5/fu2m/123/
** Grp 1 - ( pos 21 : len 3 )
xyz
** Grp 2 - ( pos 24 : len 15 )
/fe/fi/fo5/fu2m
** Grp 3 - ( pos 40 : len 3 )
123
** Grp 0 - ( pos 48 : len 42 )
http://domain.abcdef/xyz/fe/fi/fo5/fu2m/
** Grp 1 - ( pos 69 : len 3 )
xyz
** Grp 2 - ( pos 72 : len 18 )
/fe/fi/fo5/fu2m/
** Grp 3 - NULL
推荐阅读
- python - SyntaxError:文件 .pyo 中以“\xbd”开头的非 UTF-8 代码
- offset - 无法确定加载以使用来自不同寄存器的偏移量进行注册
- amazon-web-services - 最新 AWS EC2 实例中的环境变量
- c# - NotifyPropertyChanged 和 ContentControl
- javascript - JavaScript 删除 txt 文档中每 3 行的文本
- angular-material - 我应该如何将数据从我的服务传递到小吃店组件?
- java - Find which url was used to access the controller when multiple url mapping to the same controller method
- c++ - char vs. wchar_t vs. char16_t vs. char32_t
- rest-assured - 放心 - 响应正文验证
- ruby-on-rails - 删除记录时外键约束错误