php str_replace 替换自身[重复]

问题描述 投票:0回答:7

我需要将出现的所有字母

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

我怎样才能让它不替换已经替换的东西?

php str-replace
7个回答
5
投票

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

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

4
投票

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

strtr()

这个原生功能

  • 对输入字符串进行一次传递,
  • 不更换替代品,并且
  • 找到最长的匹配子字符串来替换(当在另一个限定字符串中找到限定字符串时)

代码:

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

3
投票

你可能想尝试这个

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

3
投票

摘自文档:

更换订单问题

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


1
投票

您也许可以让 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 ) );

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

0
投票

这是:

$output = preg_replace('/[aeiou]/', '[aeiou]?', $input);
© www.soinside.com 2019 - 2024. All rights reserved.