Из-за особых потребностей в хранении («почему» здесь не важно, спасибо!) Мне нужно сохранить html <a>
ссылки в определенном формате, например:
myDOMNode->setAttribute("href", "{{{123456}}}");
Все работает нормально, пока я не вызову saveHTML()
в содержащем DOMDocument. Это убивает его, поскольку он кодирует {
в %7B
.
Это устаревшее приложение, в котором href = "{{{123456}}} работает как заполнитель. Парсер синтаксического анализа ищет этот шаблон точно (unencoded) и не может быть изменен.
У меня нет выбора, кроме как сделать это таким образом.
Я не могу htmldecode () результат.
Этот HTML никогда не будет отображаться как это, это просто потребность в хранилище.
Спасибо за вашу помощь!
Примечание. Я смотрел около 2 часов, но ни одно из предложенных решений не работало для меня. Для тех, кто будет слепо отмечать вопрос как дубликат: прокомментируйте и дайте мне знать.
Поскольку устаревший код использует {{{...}}}
в качестве заполнителя, может быть безопасным использовать несколько хакерский подход с 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>