两个str_replace无法处理相同的字符串

时间:2012-01-19 21:57:17

标签: php str-replace

我正在阅读HTML文件,我想更改所有网址(在href和src属性中),例如,从中:

/static/directory/dynamic/directories

到此:

dynamic/directories

使用此功能:

foreach($array as $k => $v) {
        if(stripos($v, 'src=')!==false) {
            $array[$k] = str_replace('src="'.$this->getBadPathPart(), 'src="'.$d, $v);
        }
        if(stripos($v, 'href=')!==false) {
            $array[$k] = str_replace('href="'.$this->getBadPathPart(), 'href="'.$d, $v);
        }
    }

除了一种情况外,一切都很顺利:当一行中有两个或多个带src / href属性的标记时,只有第一个被更改。为什么呢?

示例:

  

... src =“/ bla / bla / test / test.png”.... href =“/ bla / bla / other”.... src =“/ bla / bla / doc.xls”

变为:

  

... src =“test / test.png .... href =”/ bla / bla / other“.... src =”/ bla / bla / doc.xls“

1 个答案:

答案 0 :(得分:3)

因为您正在修改数组中的值($array[$k]),但是您继续使用陈旧值$v作为起点进行修改,而不是到目前为止已达到的值。

解决此问题的最明确方法是使用引用循环:

foreach($array as &$v) {  // Note &$v
    if(stripos($v, 'src=')!==false) { 
        // You can now modify $v directly and the changes will
        // "stick" because you are looping by reference.
        $v = str_replace('src="'.$this->getBadPathPart(), 'src="'.$d, $v); 
    } 
    if(stripos($v, 'href=')!==false) { 
        $v = str_replace('href="'.$this->getBadPathPart(), 'href="'.$d, $v); 
    } 
} 

或者,您可以保留现有代码,但更改每个分配也更新$v

$array[$k] = $v = str_replace(...);