php str_replace替换自己

Dan*_*ani 5 php str-replace

我需要更换一个字母的每一次出现a,o,i,e,u[aoieu]?
我试图做到以下几点:

str_replace(array('a', 'o', 'i', 'e', 'u'), '[aoieu]?', $input);
Run Code Online (Sandbox Code Playgroud)

但是当给予它输入black而不是给我预期bl[aoieu]?ck它给了我

bl[a[ao[aoi[aoie[aoieu]?]?[aoieu]?]?[aoie[aoieu]?]?[aoieu]?]?[aoi[aoie[aoieu]?]?[aoieu]?]?[aoie[aoieu]?]?[aoieu]?]?ck
Run Code Online (Sandbox Code Playgroud)

如何才能让它不能替换已经更换过的东西?

Emi*_*röm 5

您可以考虑为此使用正则表达式,或者您可以创建自己的函数,一次遍历字符串一个字母。这是一个正则表达式解决方案:

preg_replace('/[aoieu]/', '[aoieu]?', $input);
Run Code Online (Sandbox Code Playgroud)

或者您自己的函数(请注意,$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');
Run Code Online (Sandbox Code Playgroud)