对同一变量执行多个preg_replace


multiple preg_replace on the same variable

在深入研究一些旧代码时,我偶然发现了一个函数,该函数用于过度使用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。由于清晨和/或没有好咖啡,我自己到目前为止都找不到。

有什么建议吗?

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

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

我认为您可以使用str_replace进行此用途。不确定要替换的字符tho。但如果str_replace工作,它将比那些preg_replace快得多。

但是,这些行是不是太慢了你的应用程序,还是只是看到了一些你可以清理的东西?因为如果是这样的话,不要忘记准备足够的测试来避免产生问题。

您应该在此处使用strtr

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

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

您不需要对此操作使用regexp(将常量字符串替换为另一个(,str_replace就足够了。此外,str_replace允许根据您的需要逐阵列替换

preg_replacestr_replace都将比专为此目的设计的strtr慢。

echo strtr("This is a test","aiu","AIU");

将给出

ThIs Is A test