Возможный дубликат:
Как разбить строку на 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;