【问题标题】:PHP regex last occurrence of wordsPHP 正则表达式最后出现的单词
【发布时间】:2017-09-15 13:27:13
【问题描述】:

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

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

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

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

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

谢谢!

【问题讨论】:

  • 我怎么没有意识到这一点?太感谢了! @chris85
  • 您可以保持模式不变,只需添加U 修饰符。如果您的输入字符串中没有换行符,请删除s
  • 不能用explode吗?
  • 正则表达式要好得多@Script47
  • @Leonardo 怎么样?有什么来源吗?真正感兴趣,因为我不喜欢正则表达式,所以它可能会激励未来使用它。

标签: php regex preg-replace preg-match


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-11-24
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多