【问题标题】:Truncate string after certain number of substring occurrences in PHP? [duplicate]在PHP中出现一定数量的子字符串后截断字符串? [复制]
【发布时间】:2013-01-03 22:14:53
【问题描述】:

可能重复:
How to split a string in PHP at nth occurrence of needle?

假设我有一个字符串变量:
$string = "1 2 3 1 2 3 1 2 3 1 2 3";

我想从子字符串“2”的第四次出现开始截断这个字符串的结尾,所以$string 现在等于:
"1 2 3 1 2 3 1 2 3 1"
有效地削减了“2”的第四次出现及其之后的所有内容。怎么做呢?我知道如何用substr_count($string,"2"); 计算出现次数,但我没有找到任何其他在线搜索。

【问题讨论】:

  • 到目前为止,我可以使用 substr_count 来获取字符串中出现的次数
  • 出现次数在这里是错误的,你应该专注于这些出现的位置(提示:使用strpos())。所以你应该循环 4 次,在第 4 次循环之后取一个子字符串直到第 4 次出现。

标签: php string variables substring truncate


【解决方案1】:

要找到第四个 2 的位置,您可以从偏移量 0 开始并递归调用 $offset = strpos($str, '2', $offset) + 1,同时跟踪到目前为止您匹配了多少个 2。一旦你达到 4,你就可以使用substr()

当然,上面的逻辑并没有考虑到false 的返回或没有足够的 2,我将把它留给你。


您还可以使用 preg_match_allPREG_OFFSET_CAPTURE 标志来避免自己进行递归。


另一个选项,扩展 @matt 想法:

implode('2', array_slice(explode('2', $string, 5), 0, -1));

【讨论】:

    【解决方案2】:
    $string = explode( "2", $string, 5 );
    $string = array_slice( $string, 0, 4 );
    $string = implode( "2", $string );
    

    在此处查看实际操作:http://codepad.viper-7.com/GM795F


    为了增加一些混乱(人们不会这样做),你可以把它变成一个单行:

    implode( "2", array_slice( explode( "2", $string, 5 ), 0, 4 ) );
    

    在此处查看实际操作:http://codepad.viper-7.com/mgek8Z


    对于更理智的方法,将其放入函数中:

    function truncateByOccurence ($haystack, $needle,  $limit) {
        $haystack = explode( $needle, $haystack, $limit + 1 );
        $haystack = array_slice( $haystack, 0, $limit );
        return implode( $needle, $haystack );
    }
    

    在此处查看实际操作:http://codepad.viper-7.com/76C9VE

    【讨论】:

    • 它似乎在那里工作,我必须在我的脚本中测试它
    • @MirkoAdari,当我发布这个时,我不知道 implode 和 explode 做了什么(我只需要一个快速的谷歌搜索就可以找出它们)。这个答案更容易理解,因为它将必须完成的工作分解为各个步骤。
    • @MirkoAdari - 当我开始写这个答案时,你还没有发布。在我完成编写、提供演示并发布后,我意识到您刚刚给出了类似的答案。我认为这更完整,所以我把它留在这里。
    • @MirkoAdari - 另外,你忘了限制explode
    【解决方案3】:

    也许这对你有用:

    $str = "1 2 3 1 2 3 1 2 3 1 2 3"; // initial value
    preg_match("#((.*)2){0,4}(.*)#",$str, $m);
    //var_dump($m);
    $str = $m[2]; // last value
    

    【讨论】:

      【解决方案4】:

      这段代码 sn-p 应该这样做:

      
      implode($needle, array_slice(explode($needle, $string), 0, $limit));
      

      【讨论】:

        【解决方案5】:

        像这样简单的东西怎么样

        $newString = explode('2',$string);
        

        然后根据需要循环遍历数组:

        $finalString = null;
        for($i=0:$i<2;$i++){
            $finalString .= 2 . $newString[$i];
        }
        
        echo $finalString;
        

        【讨论】:

        • 好主意,但您可以通过在explode 中使用$limit 参数来消除循环。
        猜你喜欢
        • 1970-01-01
        • 2014-08-14
        • 1970-01-01
        • 2015-03-12
        • 2017-06-16
        • 1970-01-01
        • 1970-01-01
        • 2012-05-30
        • 1970-01-01
        相关资源
        最近更新 更多