在深入研究一些旧代码时,我偶然发现了一个用于使用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。由于清晨和/或缺乏好咖啡,我到目前为止无法找到它。
有什么建议吗?
答案 0 :(得分:6)
就你要担心替换字符而言,你可以使用strtr
Docs,它有一个很好的数组参数:
$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));
答案 3 :(得分:1)
你不需要regexp到这个操作(将常量字符串替换为另一个),str_replace
就足够了。此外,str_replace
允许根据需要用数组替换数组
答案 4 :(得分:1)
preg_replace
或str_replace
都会比strtr
更慢,而echo strtr("This is a test","aiu","AIU");
就是为此目的而设计的。
ThIs Is A test
将给出
{{1}}