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

时间:2017-09-15 13:27:13

标签: php regex preg-replace preg-match

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

我想从此字符串中删除根文件夹,以仅获取公用文件夹,因为某些服务器内部有多个网站。

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:3)

你必须使用一个贪婪的量词,并检查替代是否使用外观包含在斜杠之间:

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

关于外观:我使用带有否定字符类的负面外观来检查字符串是否同时存在斜杠或限制。这样您就可以确定例如html是一个文件夹,而不是另一个文件夹名称的一部分。

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

答案 1 :(得分:2)

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

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

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

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