【问题标题】:Change a relative URL to absolute URL将相对 URL 更改为绝对 URL
【发布时间】:2010-07-27 10:45:18
【问题描述】:

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

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

我想将绝对网址附加到所有没有给出绝对域的href。

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

提前致谢!

【问题讨论】:

  • 虽然 regex 可能会暂时让您继续前进,但在以后的时间点可能会很危险。最好将其解析为 xml,检查属性是否以 http:// 开头,如果不是,则在前面加上 http://mydomain.com/
  • test 应该添加到示例中...

标签: php regex url hyperlink


【解决方案1】:

找到了一个好方法:

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

如果您的 $html 中还有 mailto 链接,您可以使用 (?!http|mailto)

【讨论】:

    【解决方案2】:
    $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);
    }   
    

    【讨论】:

    • Romka,我为你格式化了你的代码,这样我们在阅读时就不会流血。
    【解决方案3】:

    上一个答案将导致您的第一个和第四个示例出现问题,因为它没有包含正斜杠来将页面与页面名称分开。诚然,这可以通过简单地将其附加到 $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" 之类的链接,该链接是相对于当前目录的,目前显示的任何一种方法都不能正确处理不在根目录中的相对链接。为了提供一个解决方案,尽管需要更多信息来说明信息的来源。

    【讨论】:

      猜你喜欢
      • 2011-01-08
      • 1970-01-01
      • 2014-12-12
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 2018-12-13
      相关资源
      最近更新 更多