Для начала вы можете перестать использовать регулярные выражения для обработки HTML, особенно когда то, что вы делаете, так легко сделать с помощью анализатора HTML (из которых PHP имеет по крайней мере 3). Например:
$dom = new DomDocoument;
$dom->loadHTML($html);
$images = $dom->getElementsByTagName('img');
foreach ($images as $image) {
$src = $image->getAttribute('src');
$url = parse_url($src);
$image->setAttribute('src', http_build_url('http://www.example.com', $url);
}
$html = $dom->saveHTML();
Проблема решена. Ну, почти. Случай, когда вы добавляете имя хоста к относительным URL, но не к тем, которые начинаются с /, немного озадачивает и не обрабатывается в этом фрагменте, но это относительно небольшое изменение (оно включает проверку $url['path']
).
См. Анализ HTML с PHP и DOM , объектная модель документа , parse_url()
и http_build_url()
. PHP имеет гораздо лучшие инструменты для этого, чем регулярные выражения.
Да, и для правильной меры прочитайте Разбор HTML Путь Ктулху .