2010-11-16 4 views

ответ

4

Поскольку вы хотите найти и заменить символы, которые вы можете сделать это, как:

// function to replace every '$n'th occurrence of $find in $string with $replace. 
function NthReplace($string,$find,$replace,$n) { 
     $count = 0; 
     for($i=0;$i<strlen($string);$i++) { 
       if($string[$i] == $find) { 
         $count++; 
       } 
       if($count == $n) { 
         $string[$i] = $replace; 
         $count = 0; 
       } 
     } 
     return $string; 
} 

Ideone Link

+0

спасибо, а как насчет группы по 3 или 5 или ... – kelester

+0

@kelester: Я обновил свой пост. – codaddict

+0

Это не удается, когда 'fun' вызывается для другой строки, если предыдущий вызов возвращен с нечетным номером счетчика. Просто вызовите 'preg_replace_callback ('/() /', 'fun', $ string)' два раза подряд в указанной строке, и вы получите разные результаты. – Gumbo

6

Вы можете использовать комбинацию из explode, array_chunk, array_map и implode:

$words = explode(' ', $string); 
$chunks = array_chunk($words, 2); 
$chunks = array_map(function($arr) { return implode(' ', $arr); }, $chunks); 
$str = implode(',', $chunks); 

Но это предполагает, что каждое слово отделяется пробелом.

Другой и, возможно, проще решением является использование preg_replace следующим образом:

preg_replace('/(\S+\s+\S+)\s/', '$1,', $string) 

узора (\S+\s+\S+)\s соответствует любой последовательности из одного или более не-пробельных символов (\S+), а затем с помощью одного или более пробельных символов (\s+) , за которым следует один или несколько символов без пробелов, за которым следует один пробельный символ и заменяет последнее пробельное пространство запятой. Ведущие пробелы будут проигнорированы.

Так матчи будут в этом случае:

a b c d e f g h i 
\__/\__/\__/\__/ 

, которые затем заменяются следующим образом:

a b,c d,e f,g h,i 
+0

+1 для preg_replace - отлично работает. –

1
function insertAtN($string,$find,$replace,$n) { 
     $borken = explode($find, $string); 
     $borken[($n-1)] = $borken[($n-1)].$replace; 
     return (implode($find,$borken)); 
    } 

    $string ="COMPREHENSIVE MOTORSPORT RACING INFORMATION"; 
    print insertAtN($string,' ',':',2) 
    //will print 
    //COMPREHENSIVE MOTORSPORT:RACING INFORMATION 
Смежные вопросы