正则表达式 preg_match 不按预期工作

3

我将从数据库中获取链接,它们的格式如下:

www.website.com/games/randomcode1/RANDOM-URL-TITLE-NEEDED.html
www.website.com/blabla/randomcode2/RANDOM-URL-TITLE-NEEDED2.htm
www.website.com/whatever/randomcode2/RANDOM-URL-TITLE-NEEDED3.html

在我的foreach循环中,URL表示为$row['links'];,我想要做的是只获取RANDOM-URL-TITLE-NEED。这意味着我需要从最后一个斜杠(在随机代码之后)开始直到URL结束的文本。我正在使用这个preg match函数来获取我所需的内容,但似乎我在正则表达式的开头失败了(?). 有什么建议吗:
preg_match('#/(?:.*?).htm#is', $row['links'], $vardas);
$vardas = $vardas[0];
2个回答

2
一种更加简洁的方法,不需要使用正则表达式:
echo pathinfo($url)['filename'];

2
你实际上是匹配第一个/,然后匹配任何1个或多个字符,直到第一个htm
我认为你需要:
#/([^/]*)\.html?$#i

查看正则表达式演示

细节:

  • / - 一个字面上的 /
  • ([^/]*) - 第一组捕获除了/之外的0个或多个字符
  • \. - 一个字面上的 .
  • html? - 匹配 htmlhtm
  • $ - 字符串结束

如果您传递字符串数组,则为preg_filter的模式变体:

$urls = array("www.website.com/games/RANDOM-URL-TITLE-NOT_NEEDED.xhtml",
    "www.website.com/games/randomcode1/RANDOM-URL-TITLE-NEEDED.html",
    "www.website.com/blabla/randomcode2/RANDOM-URL-TITLE-NEEDED2.htm",
    "www.website.com/whatever/randomcode2/RANDOM-URL-TITLE-NEEDED3.html");

print_r(preg_filter('#^.*/(.*)\.html?$#i', '$1', $urls));

请查看PHP演示,仅返回结果。
[1] => RANDOM-URL-TITLE-NEEDED
[2] => RANDOM-URL-TITLE-NEEDED2
[3] => RANDOM-URL-TITLE-NEEDED3

更新后的正则表达式模式匹配:

  • ^ - 字符串的开头
  • .*/ - 除换行符外的0个或多个字符,尽可能多地匹配到最后一个/和斜杠本身
  • (.*) - 第一组捕获任何0个或多个非换行符,尽可能多地匹配到最后一个字符
  • \.html? - .htm.html子字符串...
  • $ - 字符串结尾。

$1是对第一组捕获值的反向引用。


我明白了,我已经添加了关于在 preg_filter 中使用的更新正则表达式的说明。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接