我有以下字符串
https://www.example.com/int/de
并希望匹配网址末尾的语言代码,例如' de' 我用这个正则表达式做到了
/\..*\/.*\/([^\/?]*)\/?$/gi
如果网址以斜杠
结尾,我也希望得到相同的结果但是https://www.example.com/int/de/
我只能获得一场完整的比赛,但是这个小组并不匹配' de'虽然最后一个斜杠在正则表达式中是可选的
某人可能是我的错误吗?
答案 0 :(得分:2)
作为替代方案,您可以考虑使用parse_url与explode和rtrim来获取最后一部分。
$strings = [
"https://www.example.com/int/de/",
"https://www.example.com/int/de"
];
foreach ($strings as $string) {
$parts = explode("/", rtrim(parse_url($string, PHP_URL_PATH), '/'));
echo end($parts) . "<br>";
}
那会给你:
de
de
答案 1 :(得分:1)
错误并不明显,但通常是错误的:&#34;泛型&#34;贪婪点匹配模式后跟一系列可选子模式(可以匹配空字符串的模式)。
\..*\/.*\/([^\/?]*)\/?$
模式匹配如下:\..*
匹配.
,然后匹配尽可能多的0+字符,然后开始\/
的回溯以匹配{ {1}}这是字符串中最右边的/
(最后一个),然后/
再次匹配任何0+字符,然后使引擎进一步回溯并强制它丢弃之前找到的.*\/
并重新匹配之前的/
以容纳字符串中另一个最右边的/
。然后,最后来/
,但前一个([^\/?]*)\/?$
已在URL中与.*\/
匹配,并且正则表达式索引位于字符串结尾。因此,由于/
可以匹配除([^\/?]*)
以外的0 +字符,?
和/
可以匹配0 \/?
字符,因此它们都匹配空字符串字符串,/
每天调用它,正则表达式引擎返回组1中空值的有效匹配。
摆脱贪婪的点,使用
$
请参阅regex demo
<强>详情
'~([^\/?]+)\/?$~'
- 捕获第1组:([^\/?]+)
和?
/
- 1或0 \/?
个字符/
- 在字符串的末尾。答案 2 :(得分:0)
问号matches zero or 1 character。你需要不止一个来匹配&#34; de&#34;。尝试使用.*
或.+
代替?
。
顺便说一下,可能更易维护的RegEx将是:
/.*\/([^/]*)\/?$/gi
正则表达式匹配任何内容(.*
),后跟正斜杠(\/
),后跟不是正斜杠,零次或多次({{ 1}}),后跟可选的正斜杠([^/]*
),然后是文本的结尾(\/?
)&#39;。这样,在最后一个正斜杠和语言部分之前的所有字符将匹配“匹配任何东西”。正则表达式的一部分。请注意代表语言匹配的部分周围的括号。