например, у меня есть строка вроде этого:
$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", ссылка относится к текущему каталогу, ни один из методов, показанный до сих пор, не будет корректно работать для относительных ссылок, которые не находятся в корневом каталоге. Чтобы обеспечить решение, которое, хотя потребуется больше информации о том, откуда получена информация.