Как я могу заменить содержимое элемента с помощью PHP :: DOMDocument?

#php #html #dom

#php #HTML #dom

Вопрос:

У меня много данных в head моем документе, но я хочу добавить больше данных. Итак, как я могу заменить содержимое <head> тега с помощью PHP::DOMDocument?

У меня есть следующий код:

 $dom = new DOMDocument('1.0', 'UTF-8');
@$dom->loadHTML($page);

$head = $dom->getElementsByTagName('head');

$keywords = new DOMElement('meta');
keywords->setAttribute('name', 'keywords');
$keywords->setAttribute('content', $page_def['keywords']);
$head->appendChild($keywords);

$description = new DOMElement('meta');
$description->setAttribute('name', 'description');
$description->setAttribute('content', $page_def['description']);
$head->appendChild($description);

$page = $dom->saveHTML();

page::dump($page);return;
  

Но я получаю сообщение об ошибке: Вызов неопределенного метода DOMText::setAttribute()

РЕДАКТИРОВАТЬ: В итоге я увидел, что использовать PHP:DOMDocument для этого очень сложно. В этом случае я использовал следующий код:

 // Add the small meta data set to the header
$page = utility::replaceStringBetween('<head>', '</head>', $header . $headers, $page);
if (utility::getReplacementCount() == 0)
{
    $error = "During page write: The head tags could not be modified within your page";
    if (settings::getConfig('context') == 'production')
    {
        if (settings::getConfig('log_enabled') == 'true')
        {
            dblog::insert(user::getId(), $error, 'error');
        }
    }
    // So the live pages will display correctly, unset the merge mode since the process which unsets it will fail to execute
    if (isset($_SESSION['merge_mode'])) unset($_SESSION['merge_mode']);

    print $error;
    return;
}

/**
* Replace the value between two other values in a string
* 
* @param string start delimeter
* @param string end delimeter
* @param string replacement
* @param string original source
* @param int limit replacement count
* @return string
*/
public static function replaceStringBetween($start, $end, $new, $source, $limit = 1)
{
    $result = preg_replace('#('.preg_quote($start) . ')(.*)('.preg_quote($end) 
        . ')#is', '$1' . $new . '$3', $source, $limit, $count);

    if ($count > 0)
    {
        self::$replacement_count  ;
        return $result;
    }
    $result = preg_replace ("#{$start}(.*){$end}#is", $new, $source, $limit, $count);
    if ($count > 0)
    {
        self::$replacement_count  ;
        return $result;
    }
    return $source;
}
  

Ответ №1:

setAttribute() не работает на DOMText узлах.

попробуйте это:

 $keywords = $dom->createElement('meta');
  

Комментарии:

1. Я попробовал createElement, но он не поддерживает модификацию: ошибка «Изменение не разрешено»

2. $dom->createElement() у меня все работает просто отлично.. Я получаю ошибку, только если я использую new DOMElement()

Ответ №2:

Попробуйте использовать getElementsByTagName, чтобы найти <head> тег, а затем appendChild, чтобы добавить еще . . . . материал.

В качестве альтернативы вы могли бы отредактировать DOMNode->$nodeValue .

Комментарии:

1. Я получаю сообщение об ошибке. Я задокументировал это в своем вопросе. Приветствуется любая помощь.

2. @Noor Попробуйте использовать createElement вместо createTextNode

3. Я попробовал createElement, но он не поддерживает модификацию: ошибка «Изменение не разрешено»

Ответ №3:

Но я получаю сообщение об ошибке: вызов неопределенного метода DOMText::setAttribute()

Это потому, что в классе setAttribute DOMText нет метода. ………. в классе DOMText……….. В DOMElement есть такое.

Комментарии:

1. Я обновил свой приведенный выше код, но я получаю эту ошибку: Ошибка «Не разрешено изменение с использованием setAttribute».