Изменить относительный URL на абсолютный URL - PullRequest
5 голосов
/ 27 июля 2010

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

$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 **;)

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

Ответы [ 3 ]

9 голосов
/ 27 июля 2010

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

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

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

4 голосов
/ 27 июля 2010
$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);
}   
1 голос
/ 27 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...