使用PHP domdocument添加根路径的问题


problem with adding root path using php domdocument

我想为那些没有使用php dom文档的根路径的锚标记添加站点的根路径,到目前为止,一个已经用str_replace函数做了一个函数,但对于一些链接,它添加了三次根路径。那么我应该在这个函数中编辑什么呢?

问题:=问题是它为每个锚标记添加了三倍和三倍的根路径,而不是一些。$HTML变量有很多锚标记,大约超过200个链接。对于图片也是一样。

我知道这是一个很下流的问题,但是我错过了什么,我不能得到。

function addRootPathToAnchor($HTML)
{
    $tmpHtml = '';
    $xml = new DOMDocument();
    $xml->validateOnParse = true;
    $xml->loadHTML($HTML);
   foreach ($xml->getElementsByTagName('a') as $a )
   {
      $href = $a->getAttribute('href');
      if(strpos($href,'www' > 0))
        continue;
      else
        $HTML = str_replace($href,"http://www.mysite.com/".$href,$HTML);  
   }
   return $HTML;
}

我在你的代码中看到一些问题:

  1. 决定URI是否有完整的根路径(是一个完全限定的URI)。
  2. 你没有将相对URL解析为基础URL。仅仅追加是不行的。
  3. 函数返回一个DomDocument对象而不是字符串。我猜你不希望那样,但是我不知道,你还没有写在你的问题里。

如何检测URL是否为相对URL

相对url不指定协议。因此,我将检查它,以确定href属性是否是完全限定(绝对)URI (Demo):

$isRelative = (bool) !parse_url($url, PHP_URL_SCHEME);

将相对URL解析为基URL

然而,这并不能帮助你正确地将相对URL解析为基础URL。你所做的在概念上是错误的。在RFC中指定了如何将相对URI解析为基本URL (RFC 1808和RFC 3986)。您可以使用一个现有的库来为您完成工作,一个可用的库是Net_URL2:

require_once('Net/URL2.php'); # or configure your autoloader
$baseUrl = 'http://www.example.com/test/images.html';
$hrefRelativeOrAbsolute = '...';
$baseUrl = new Net_URL2($baseUrl);
$urlAbsolute = (string) $baseUrl->resolve($hrefRelativeOrAbsolute);

if(strpos($href,'www') !== false)代替if(strpos($href,'www' > 0))

> 0在函数调用(strpos())内部