1
$text = "abc def ghi abc def ghi abc def ghi abc"
$search = "abc";
$regex = '/(\s)'.$search.'(\s)/i';
$array_key = array();
if(preg_match_all($regex, $text, $tmp)) {
    $array_key = $tmp[0];
    $n = count($tmp[0]);
    for($i=0; $i<$n; $i++) {
        if($n % 2 == 0) {
            $content = str_replace($array_key[$i], 'ABC', $text);
        }
} 

$content をエコーすると、次のように出力されます。

" ABC def ghi ABC def ghi ABC def ghi ABC"

しかし、私は結果が「ABC def ghi abc def ghi ABC def ghi abc」であることを望んでいます。なぜなら$n % 2 == 0、それを修正する方法は?

4

3 に答える 3

0

問題は、str_replace がすべての針を置換することです。

また..正規表現を使用する必要がありますか? このhttp://bluedogwebservices.com/replace-every-other-occurrence-with-str_replace/を見たことがありますか?

于 2012-05-17T05:14:59.243 に答える
0

1 つのアプローチはpreg_replace_callback、 とグローバル変数を使用して反復を追跡することです。これが以下のアプローチです。

$replacer_i = 0;
function replacer( $matches ) {
  global $replacer_i;
  return $replacer_i++ % 2 === 0 
    ? strtoupper($matches[0]) 
    : $matches[0];
}

$string = "abc def ghi abc def ghi abc def ghi abc";
$string = preg_replace_callback( "/abc/", "replacer", $string );

// ABC def ghi abc def ghi ABC def ghi abc
print $string;

もう 1 つの方法は、文字列を分割し、"abc" の他のすべてのインスタンスを大文字の形式に置き換えてから、パーツを結合して新しい文字列に戻すことです。

$string = "abc def ghi abc def ghi abc def ghi abc";
$aparts = explode( " ", $string );
$countr = 0;

foreach ( $aparts as $key => &$value ) {
  if ( $value == "abc" && ( $countr++ % 2 == 0 ) ) {
    $value = strtoupper( $value );
  }
}

// ABC def ghi abc def ghi ABC def ghi abc
print implode( " ", $aparts );
于 2012-05-17T05:15:37.707 に答える
-1

これを試して:

<?php
$text = "abc def ghi abc def ghi abc def ghi abc";
$search = "ghi";
$regex = '/('.$search.')(.*)/i';
$array_key = array();
if(preg_match($regex, $text, $tmp)) {
    $c = strtoupper($tmp[1]);
    $content = str_replace( $tmp[1] . $tmp[2], $c .  $tmp[2], $tmp[0] );
    $content = str_replace( $tmp[1] . $tmp[2], $content, $text );
}

echo $content;
?>

それが役に立てば幸い。

于 2012-05-17T05:40:49.537 に答える