在同一个变量上有多个preg_replace

时间:2011-08-22 07:23:49

标签: php

在深入研究一些旧代码时,我偶然发现了一个用于使用preg_replace非常过分地清理特殊字符的函数。不幸的是,没有办法避免这种清理,混乱的数据从外部传来。

/* Example 1: current code */
$item = preg_replace('/' . chr(196) . '/',chr(142),$item);
$item = preg_replace('/' . chr(214) . '/',chr(153),$item);
$item = preg_replace('/' . chr(220) . '/',chr(154),$item);

这些行中有很多行,并且都是相同的(使用不同的字符),所以应该有更好的方法来做到这一点。我对此进行优化的第一次迭代是使用索引数组,如下所示:

/* Example 2: slightly optimized code */
$patterns = array();
$patterns[0] = '/'.chr(196).'/'; 
$patterns[1] = '/'.chr(214).'/';
$patterns[2] = '/'.chr(220).'/';

$reps = array();
$reps[0] = chr(142); 
$reps[1] = chr(153);
$reps[2] = chr(154);

$item = preg_replace($patterns,$reps,$item);

它完成了这项工作,但我想有一个更好和/或更快的方式来做这件事更容易和更聪明 - 甚至可能没有preg_replace。由于清晨和/或缺乏好咖啡,我到目前为止无法找到它。

有什么建议吗?

5 个答案:

答案 0 :(得分:6)

就你要担心替换字符而言,你可以使用strtrDocs,它有一个很好的数组参数:

$map = array(
  chr(196) => chr(142), 
  chr(214) => chr(153),
  chr(220) => chr(154),
);

$item = strtr($item, $map);

答案 1 :(得分:2)

我认为您可以使用str_replace进行此项使用。不确定你要替换的角色。但如果str_replace有效,则会比那些preg_replace快得多。

但是,这些线条是否会使您的应用程序放慢速度,或者只是看到可以清理的内容?因为如果是的话,不要忘记准备足够的测试以避免产生问题。

答案 2 :(得分:1)

您应该在这里使用strtr

$item = strtr($item, chr(196) . chr(214), chr(142) . chr(153));

http://php.net/manual/en/function.strtr.php

答案 3 :(得分:1)

你不需要regexp到这个操作(将常量字符串替换为另一个),str_replace就足够了。此外,str_replace允许根据需要用数组替换数组

答案 4 :(得分:1)

preg_replacestr_replace都会比strtr更慢,而echo strtr("This is a test","aiu","AIU"); 就是为此目的而设计的。

ThIs Is A test

将给出

{{1}}