php regex最后有可选的char

时间:2018-05-28 09:47:39

标签: php regex regex-group

我有以下字符串

https://www.example.com/int/de

并希望匹配网址末尾的语言代码,例如' de' 我用这个正则表达式做到了

/\..*\/.*\/([^\/?]*)\/?$/gi

如果网址以斜杠

结尾,我也希望得到相同的结果

但是https://www.example.com/int/de/我只能获得一场完整的比赛,但是这个小组并不匹配' de'虽然最后一个斜杠在正则表达式中是可选的

某人可能是我的错误吗?

3 个答案:

答案 0 :(得分:2)

作为替代方案,您可以考虑使用parse_urlexplodertrim来获取最后一部分。

$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;。这样,在最后一个正斜杠和语言部分之前的所有字符将匹配“匹配任何东西”。正则表达式的一部分。请注意代表语言匹配的部分周围的括号。