我需要用a替换字母oieu[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

我如何才能不替换已经替换的东西?

最佳答案

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

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

08-19 01:39