2012-01-19 52 views
0

我在阅读HTML文件,我想改变所有的URL(在href和SRC属性),例如,从这个:两个str_replace函数不工作相同的字符串

/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.png” .... HREF = “/ BLA/BLA /其他” .... SRC =” /bla/bla/doc.xls “

变为:

... SRC = ”测试/ test.png .... HREF =“/ BLA/BLA /其他” .. .. src =“/ bla/bla/doc.xls”

回答

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(...);