PHP 正则表达式最后一次出现的单词

PHP regex last occurrence of words

我的字符串是:/var/www/domain.com/public_html/foo/bar/folder/another/..

我想从这个字符串中删除根文件夹,只得到 public 文件夹,因为有些服务器里面有多个网站。

我的实际正则表达式是:/^(.*?)(www|public_html|public|html)/s

我的实际结果是:/domain.com/public_html/foo/bar/folder/another/..

但我想删除最后一个 ocorrence,并得到这样的东西:/foo/bar/folder/another/..

谢谢!

您必须使用贪心量词并使用环视检查替代项是否包含在斜杠之间:

/^.*(?<![^\/])(?:www|public(?:_html)?|html)(?![^\/])/

关于lookarounds:我使用否定字符class的negative lookarounds同时检查是否有斜杠或字符串的限制。这样你就可以确定 html 是一个文件夹而不是另一个文件夹名称的一部分。

我删除了无用的 s 修饰符。我也删除了捕获组,因为目标是用空字符串替换所有。

? 使你的表达式不贪婪,这实际上不是你想要的。尝试:

^(.*)(www|public_html|public|html)

应该一直持续到最后一场比赛。

演示:https://regex101.com/r/v5WbB3/1/