2012-01-19 3 views
0

に取り組んでいないと私は(HREFおよびSRC属性で)すべてのURLを変更したい:二str_replaceは、私はHTMLファイルを読んでいるものと同じ文字列

/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); 
     } 
    } 

すべてがうまく1つの状況を除いて動作します:1行中のsrc/href属性を持つ2個の以上のタグがある場合、最初に変更されるだけです。どうして?

例:

... 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(...); 
関連する問題