php str_replace替换自己

时间:2011-08-11 13:25:14

标签: php str-replace

我需要用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

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

7 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

Taken from the documentation:

  

更换订单

     

因为str_replace()从左到右替换,所以它可能会替换a   多次替换时先前插入的值。

答案 2 :(得分:2)

您可能想尝试这个

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

答案 3 :(得分:2)

我建议避免使用preglike函数并使用strtr:

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

这是:

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

答案 6 :(得分:0)

你或许可以让preg_replace为你处理这个问题(参见Thax,Emil等人的回答)。 否则,如果这太复杂,你可以,标记化:

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