1

重複の可能性:
針のn番目の出現時にPHPで文字列を分割する方法は?

文字列変数があるとしましょう:
$string = "1 2 3 1 2 3 1 2 3 1 2 3";

部分文字列「2」の4番目のオカレンスからこの文字列の終わりを切り取りたいので、これ$string
"1 2 3 1 2 3 1 2 3 1"
次のようになります。「2」の4番目のオカレンスとそれ以降のすべてを効果的に切り取ります。これをどのように行うのでしょうか?で発生数を数える方法は知っていますsubstr_count($string,"2");が、オンラインで検索しているものは他に見つかりません。

4

5 に答える 5

2

4 番目の位置を見つけるには、オフセット 0 から開始し、これまでに一致した 2 の数を追跡しながら2再帰的に呼び出すことができます。$offset = strpos($str, '2', $offset) + 14に到達したら、そのまま使用できますsubstr()

もちろん、上記のロジックはfalse返品や十分な 2 の数を考慮していません。それはあなたに任せます。


preg_match_allフラグを使用してPREG_OFFSET_CAPTURE、自分で再帰を回避することもできます。


@matt のアイデアを拡張する別のオプション:

implode('2', array_slice(explode('2', $string, 5), 0, -1));
于 2013-01-20T20:23:31.743 に答える
1
$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

于 2013-01-20T20:29:37.987 に答える
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
于 2013-01-20T20:26:21.423 に答える
1

このコード スニペットはそれを行う必要があります。


implode($needle, array_slice(explode($needle, $string), 0, $limit));
于 2013-01-20T20:26:22.433 に答える
0

のような単純なものはどうですか

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

次に、必要な回数だけ配列をループします。

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

echo $finalString;
于 2013-01-20T20:23:47.573 に答える