2012-01-19 54 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(...);