【问题标题】:Remove last repeated word occurence in a string PHP删除字符串 PHP 中最后出现的重复单词
【发布时间】:2011-11-15 07:51:50
【问题描述】:

我需要删除字符串中最后一个重复的单词,例如:

最后一个重复单词是:all/

字符串输入示例:

  • item1/item2/all/
  • item1/item2/all/all/all/
  • item1/item2/all/all/all/all/

结果应始终为:item1/item2/

【问题讨论】:

  • 这个“最后一个重复的单词”是不是提前知道的,还是要动态找出最后一个重复的单词是什么?
  • 检查类似的quesiton已经被回答了。

标签: php


【解决方案1】:

如果这些“单词”总是用斜线分隔,那么它就像带有反向引用的正则表达式一样简单:

$str = preg_replace('#\b(\w+/)\1+$#', '', $str);
           //  here \b could be written as (?<=/) more exactly

或者如果all 是要查找的固定字符串:

$str = preg_replace('#/(all/)+$#', '/', $str);

【讨论】:

  • +1 不错的解决方案,我真的需要学习正则表达式,但它不适用于第一个示例。我假设一个简单的修复。
  • 是的。如果搜索到的词是固定的,那么all 可以替换\w+。如果它实际上不需要重复,那么\1* 而不是\1+ 就可以了。不确定 OP 用例(有点像路径名)。
  • 你为什么写#\b(而不是#/(
  • @yes123:我相信两者都会起作用。 / 但是只有在有前面的路径片段时,就像在那个确切的例子中一样。但是当然匹配/,然后再次添加'/'作为替换将是另一种选择。
【解决方案2】:

我假设您希望删除最后一个单词,以及任何重复的单词

$list = explode('/', $str);
if(end($list) == '') array_pop($list); // remove empty entry on end
$last = array_pop($list);
while(end($list) == $last) array_pop($list);
$str = implode('/', $list); // put back together

【讨论】:

    猜你喜欢
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2012-05-31
    • 2015-06-08
    相关资源
    最近更新 更多