2012-05-17 2 views
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); 
     } 
} 

Когда я эхо $ содержание выводится:Как заменить позицию строки в php?

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

Но я хочу результат "ABC def ghi abc def ghi ABC def ghi abc", потому что $n % 2 == 0, Как это исправить?

+0

'$ n' не меняется в цикле, поэтому он либо всегда четный, либо всегда нечетный. – Arjan

+0

Используйте 'preg_match' вместо' preg_match_all' ... в настоящее время он возвращает все найденные совпадения. 'preg_match' вернет только первое совпадение. –

ответ

0

Один из подходов состоит в использовании 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; 

Другой подход должен был бы разделить строку, и заменить любой другой экземпляр «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); 
-1

Try это :

<?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; 
?> 

Надеюсь, что это поможет.

+0

Почему downvote, я думаю, что он делает то, что требуется. Любые причины, пожалуйста ... помогли бы мне определить проблему. –