我正在阅读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“
答案 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(...);