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

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

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

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

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

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

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

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

Или ваша собственная функция (обратите внимание, что $search only может быть единственным символом или массивом символов, а не строками – вы можете использовать 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'); 

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

Замена заказа

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

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

 <?php $string = 'black'; $pattern = '/([aeiou])/i'; $replacement = '[aeiou]'; echo preg_replace($pattern, $replacement, $string); ?> 

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

 $result = strtr($input, array('a' => '[aoieu]?', 'o' => '[aoieu]?', 'i' => '[aoieu]?', 'e' => '[aoieu]?', 'u' => '[aoieu]?')); 
 $input = str_replace(array('a', 'o', 'i', 'e', 'u'), '~', $input); $input = str_replace('~', '[aoieu]?', $input); 

Вот:

 $output = preg_replace('/[aeiou]/', '[aeiou]?', $input); 

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

 $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 ) );