Усечь строку после определенного количества подстрок в PHP?

Возможный дубликат:
Как разбить строку на PHP при n-ом введении иглы?

Допустим, у меня есть строковая переменная:
$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"); , но я не нашел ничего другого в Интернете.

     $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

    Чтобы найти позицию четвертого 2 вы можете начать со смещения 0 и рекурсивно вызывать $offset = strpos($str, '2', $offset) + 1 , отслеживая количество 2, которые вы сопоставляли до сих пор. Как только вы достигнете 4, вы просто можете использовать substr() .

    Конечно, приведенная выше логика не учитывает false возвратов или недостаточно 2, я оставлю это вам.


    Вы также можете использовать preg_match_all с флагом PREG_OFFSET_CAPTURE чтобы избежать рекурсии самостоятельно.


    Другой вариант, расширяющий идею @matt:

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

    Может быть, это сработает для вас:

     $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 

    Этот фрагмент кода должен сделать это:

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

    Как насчет чего-то простого

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

    а затем прокручивайте массив столько раз, сколько нужно:

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