PHP使用str_replace替换多个值?

时间:2014-03-22 08:05:48

标签: php

我需要使用str_replace替换多个值。

这是我替换的PHP代码。

$date = str_replace(
       array('y', 'm', 'd', 'h', 'i', 's'),
       array('Year', 'Month', 'Days', 'Hours', 'Munites', 'Seconds'),
       $key
    );

当我在m中传递$key时,它返回输出,如。

MontHours

当我在h中传递$key时,它会返回输出。

HourSeconds

它返回此值我只想要Month

3 个答案:

答案 0 :(得分:7)

为什么它不起作用?

这是documentation for str_replace()中提到的替代问题:

  

更换订单问题

     

由于str_replace()从左到右替换,因此在执行时可能会替换先前插入的值   多次更换。另请参阅本文档中的示例。

您的代码相当于:

$key = 'm';

$key = str_replace('y', 'Year', $key);
$key = str_replace('m', 'Month', $key);
$key = str_replace('d', 'Days', $key);
$key = str_replace('h', 'Hours', $key);
$key = str_replace('i', 'Munites', $key);
$key = str_replace('s', 'Seconds', $key);

echo $key;

正如您所看到的,mMonth取代,h中的MonthHourss替换为Hours {1}}被Seconds取代。问题是,当您在h中替换Month时,无论字符Month是否代表原始{{1},您都会这样做或者最初是Month 的内容。每个m都会丢弃一些信息 - 原始字符串是什么。

这就是你得到这个结果的方式:

str_replace()

解决方案

解决方案是使用strtr(),因为它不会更改已经替换的字符。

0) y -> Year
Replacement: none

1) m -> Month
Replacement: m -> Month

2) d -> Days
Replacement: none

3) h -> Hours
Replacement: Month -> MontHours

4) i -> Munites
Replacement: none

5) s -> Seconds
Replacement: MontHours -> MontHourSeconds

答案 1 :(得分:6)

来自str_replace()的手册页:

  

<强>注意

     

替换订单问题

     

因为str_replace()从左向右替换,所以在执行多次替换时,它可能会替换先前插入的值。另请参阅本文档中的示例。

例如,&#34; m&#34;替换为&#34;月&#34;,然后&#34; h&#34;在&#34;月&#34;被&#34; Hours&#34;取代,后来在替换数组中出现。

strtr()没有这个问题,因为它会同时尝试所有相同长度的密钥:

$date = strtr($key, array(
    'y' => 'Year',
    'm' => 'Month',
    'd' => 'Days',
    'h' => 'Hours',
    'i' => 'Munites', // [sic]
    's' => 'Seconds',
));

答案 2 :(得分:-1)

更简单的解决方法是更改​​搜索顺序:

array('Year', 'Seconds', 'Hours', 'Month', 'Days', 'Minutes')

str_replacepreg_replace都会一次搜索一个搜索项。任何多值都需要确保订单不会更改先前的替换项。