Изменение относительного URL-адреса на абсолютный URL-адрес

например, у меня есть строка вроде этого:

$html = ' <a href="test.html">test</a> <a href="http://mydomain.com/test.html">test</a> <a href="http://otherdomain.com/test.html">test</a> <a href="someothertest/otherdir/hi.html">hi</a> '; 

и я хочу добавить абсолютный URL-адрес ко всем hrefs, где не указан ни один домен.

 $html = ' <a href="http://mydomain.com/test.html">test</a> <a href="http://mydomain.com/test.html">test</a> <a href="http://otherdomain.com/test.html">test</a> <a href="http://mydomain.com/someothertest/otherdir/hi.html">hi</a> '; 

Каков наилучший способ сделать это? я думаю, что-то с RegEx, но мои навыки RegEx: **;)

заранее спасибо!

нашел хороший способ:

 $html = preg_replace("#(<\s*a\s+[^>]*href\s*=\s*[\"'])(?!http)([^\"'>]+)([\"'>]+)#", '$1http://mydomain.com/$2$3', $html); 

вы можете использовать (?!http|mailto) если у вас также есть ссылки mailto в вашем $ html

 $domain = 'http://mydomain'; preg_match_all('/href\="(.*?)"/im', $html, $matches); foreach($matches[1] as $n=>$link) { if(substr($link, 0, 4) != 'http') $html = str_replace($matches[1][$n], $domain . $matches[1][$n], $html); } 

Предыдущий ответ вызовет проблемы с вашим первым и четвертым примерами, потому что он не может включить косую черту, чтобы отделить страницу от имени страницы. По общему признанию, это можно исправить, просто добавив его в домен $, но если вы это сделаете, тогда href = "/ something.php" окажется в двух.

Чтобы дать альтернативное решение Regex, вы можете пойти с чем-то вроде этого …

 $pattern = '#'#(?<=href=")(.+?)(?=")#''; $output = preg_replace_callback($pattern, 'make_absolute', $input); function make_absolute($link) { $domain = 'http://domain.com'; if(strpos($link[1], 'http')!==0) { if(strpos($link[1], '/')!==0) { return $domain.'/'.$link[1]; } else { return $domain.$link[1]; } } return $link[1]; } 

Однако стоит отметить, что с помощью ссылки, такой как href = "example.html", ссылка относится к текущему каталогу, ни один из методов, показанный до сих пор, не будет корректно работать для относительных ссылок, которые не находятся в корневом каталоге. Чтобы обеспечить решение, которое, хотя потребуется больше информации о том, откуда получена информация.