проблема с добавлением корневого пути с помощью php domdocument - PullRequest
0 голосов
/ 16 сентября 2011

Я хотел бы добавить корневой путь сайта для тех якорных тегов, которые не имеют корневого пути, используя документ 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;
}

Ответы [ 2 ]

2 голосов
/ 16 сентября 2011

Я вижу некоторые проблемы в вашем коде:

  1. Решение о том, имеет ли URI полный корневой путь (является полностью квалифицированным URI) или нет.
  2. You 'не разрешать относительные URL к базовому URL.Простое добавление не делает работу.
  3. Функция возвращает объект DomDocument, а не строку.Я предполагаю, что вы этого не хотите, но я не знаю, вы не написали в своем вопросе.

Как определить, является ли 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);
1 голос
/ 16 сентября 2011

Вместо if(strpos($href,'www' > 0)) следует использовать if(strpos($href,'www') !== false).

> 0 был внутри вызова функции (strpos()).

...