Как я могу предотвратить html-объекты с PHP DOMDocument :: saveHTML ()?

Из-за особых потребностей в хранении («почему» здесь не важно, спасибо!) Мне нужно сохранить html <a> ссылки в определенном формате, например:

 myDOMNode->setAttribute("href", "{{{123456}}}"); 

Все работает нормально, пока я не вызову saveHTML() в содержащем DOMDocument. Это убивает его, поскольку он кодирует { в %7B .

Это устаревшее приложение, в котором href = "{{{123456}}} работает как заполнитель. Парсер синтаксического анализа ищет этот шаблон точно (unencoded) и не может быть изменен.

У меня нет выбора, кроме как сделать это таким образом.

Я не могу htmldecode () результат.

Этот HTML никогда не будет отображаться как это, это просто потребность в хранилище.

Спасибо за вашу помощь!

Примечание. Я смотрел около 2 часов, но ни одно из предложенных решений не работало для меня. Для тех, кто будет слепо отмечать вопрос как дубликат: прокомментируйте и дайте мне знать.

Solutions Collecting From Web of "Как я могу предотвратить html-объекты с PHP DOMDocument :: saveHTML ()?"

Поскольку устаревший код использует {{{...}}} в качестве заполнителя, может быть безопасным использовать несколько хакерский подход с preg_replace_callback . После создания HTML-кода будут восстановлены заполнители, закодированные URL-адресом.

 $src = <<<EOS <html> <body> <a href="foo">Bar</a> </body> </html> EOS; // Create DOM document $dom = new DOMDocument(); $dom->loadHTML($src); // Alter `href` attribute of anchor $a = $dom->getElementsByTagName('a') ->item(0) ->setAttribute('href', '{{{123456}}}'); // Callback function to URL decode match $urldecode = function ($matches) { return urldecode($matches[0]); }; // Turn DOMDocument into HTML string, then restore/urldecode placeholders $html = preg_replace_callback( '/' . urlencode('{{{') . '\d+' . urlEncode('}}}') . '/', $urldecode, $dom->saveHTML() ); echo $html, PHP_EOL; 

Выход (с отступом для ясности):

 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> <html> <body> <a href="{{{123456}}}">Bar</a> </body> </html>