代码之家  ›  专栏  ›  技术社区  ›  choise

将相对URL更改为绝对URL

  •  5
  • choise  · 技术社区  · 14 年前

    例如,我有这样一个字符串:

    $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>
            ';
    

    $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>
            ';  
    

    提前谢谢!

    3 回复  |  直到 14 年前
        1
  •  9
  •   choise    14 年前

    找到一个好方法:

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

    (?!http|mailto)

        2
  •  4
  •   Simone Carletti    12 年前
    $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);
    }   
    
        3
  •  1
  •   Peter O'Callaghan    14 年前

    前面的答案将导致第一个和第四个示例出现问题,因为它没有包含一个正斜杠来分隔页面和页面名称。诚然,这可以通过简单地将其附加到$domain来解决,但是如果您这样做,那么href=“/something.php”将得到两个。

    只是为了给一个替代的正则表达式解决方案,你可以这样做。。。

    $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”这样的链接,该链接是相对于当前目录的,到目前为止,对于根目录中不存在的相对链接,两种方法都不能正常工作。为了提供一个解决方案,尽管需要更多关于信息来源的信息。