проблема с добавлением корневого пути с использованием php domdocument

Я хотел бы добавить корневой путь сайта для тех тегов привязки, которые не имеют корневого пути, используя php dom document. До сих пор они сделали функцию, чтобы сделать это с помощью функции 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-адреса не определяют протокол. Поэтому я должен проверить это, чтобы определить, является ли атрибут 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' > 0)) вы должны использовать if(strpos($href,'www') !== false) .

Функция > 0 находилась внутри функции-вызова ( strpos() ).