php str_replace заменяет себя - PullRequest
       0

php str_replace заменяет себя

5 голосов
/ 11 августа 2011

Мне нужно заменить каждое вхождение одной из букв a, o, i, e, u на [aoieu]?
Я пытался сделать следующее:

str_replace(array('a', 'o', 'i', 'e', 'u'), '[aoieu]?', $input);

Но когда он дал ему black вместо того, чтобы дать мне ожидаемый bl[aoieu]?ck, он дал мне

bl[a[ao[aoi[aoie[aoieu]?]?[aoieu]?]?[aoie[aoieu]?]?[aoieu]?]?[aoi[aoie[aoieu]?]?[aoieu]?]?[aoie[aoieu]?]?[aoieu]?]?ck

Как я могу заставить его не заменять вещи, которые он уже заменял?1016 *

Ответы [ 7 ]

4 голосов
/ 11 августа 2011

Вы можете использовать для этого регулярное выражение или создать собственную функцию, которая шагает по строке по одной букве за раз. Вот решение для регулярных выражений:

preg_replace('/[aoieu]/', '[aoieu]?', $input);

Или ваша собственная функция (обратите внимание, что $search может быть только одним символом или массивом символов, а не строками - вы можете использовать strpos или аналогичный для создания функции, которая также обрабатывает более длинные строки):

function safe_replace($search, $replace, $subject) {
  if(!is_array($search)) {
    $search = array($search);
  }
  $result = '';
  $len = strlen($subject);
  for($i = 0; $i < $len; $i++) {
    $c = $subject[$i];
    if(in_array($c, $search)) {
      $c = $replace;
    }
    $result .= $c;
  }
  return $result;
}
//Used like this:
safe_replace(array('a', 'o', 'i', 'e', 'u'), '[aoieu]?', 'black');
3 голосов
/ 11 августа 2011

Взято из документации:

Порядок замены получен

Поскольку str_replace () заменяется слева направо, он может заменитьранее вставленное значение при выполнении нескольких замен.

2 голосов
/ 11 августа 2011

Я рекомендую избегать preglike функций и использовать strtr:

$result = strtr($input, array('a' => '[aoieu]?', 
                         'o' => '[aoieu]?', 
                         'i' => '[aoieu]?', 
                         'e' => '[aoieu]?', 
                         'u' => '[aoieu]?'));
2 голосов
/ 11 августа 2011

Возможно, вы захотите попробовать это

<?php
$string = 'black';
$pattern = '/([aeiou])/i';
$replacement = '[aeiou]';
echo preg_replace($pattern, $replacement, $string);
?>
0 голосов
/ 11 августа 2011

Вы можете получить preg_replace, чтобы справиться с этим для вас (см. Ответы Такса, Эмиля и т. Д.). В противном случае, если это слишком сложно, вы можете токенизировать:

$token = '{{{}}}';
// replace the temporary value with the final value
str_replace( $token, '[aoieu]?', 
    // replace all occurances of the string with a temporary value.
    str_replace( (array('a', 'o', 'i', 'e', 'u'), $token, $input ) );
0 голосов
/ 11 августа 2011

Вот оно:

$output = preg_replace('/[aeiou]/', '[aeiou]?', $input);
0 голосов
/ 11 августа 2011
$input = str_replace(array('a', 'o', 'i', 'e', 'u'),   '~',          $input);
$input = str_replace('~',                              '[aoieu]?',   $input);
...