Два str_replace не работают на одной строке - PullRequest
0 голосов
/ 20 января 2012

Я читаю HTML-файл и хочу изменить все URL-адреса (в атрибутах 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 Ответ

3 голосов
/ 20 января 2012

Поскольку вы изменяете значение внутри массива ($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(...);
...