$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);
}
}
当我输出echo $ content时输出:
“ABC def ghi ABC def ghi ABC def ghi ABC
”
但我希望结果为“ABC def ghi abc def ghi ABC def ghi abc
”因为$n % 2 == 0
,如何解决?
答案 0 :(得分:0)
问题是str_replace会替换所有出现的针。
另外..你要使用正则表达式吗?你见过这个http://bluedogwebservices.com/replace-every-other-occurrence-with-str_replace/吗?
答案 1 :(得分: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 );
答案 2 :(得分:-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;
?>
希望它有所帮助。