Como posso impedir as entidades html com o PHP DOMDocument :: saveHTML ()?

Devido às necessidades de armazenamento personalizado (o “porquê” não é importante aqui, obrigado!) Eu tenho que salvar html links em um formato específico, como este:

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

Tudo funciona bem até eu chamar saveHTML() no DOMDocument contendo. Isso o mata, já que codifica { em %7B .

Este é um aplicativo antigo onde href = “{{{123456}}}” funciona como um espaço reservado. O analisador da linha de comando procura esse padrão exatamente (não codificado) e não pode ser alterado.

Não tenho escolha senão fazê-lo dessa maneira.

Não consigo htmldecode () o resultado.

Este HTML nunca será exibido como este, é apenas uma necessidade de armazenamento.

Obrigado pela ajuda!

Nota: olhei por volta de 2 horas, mas nenhuma da solução proposta funcionou para mim. Para aqueles que marcaram cega a questão como duplicada: por favor comente e me avise.

Como o código legado está usando {{{...}}} como um espaço reservado, pode ser seguro usar uma abordagem um tanto complicada com preg_replace_callback . O seguinte restaurará os espaços reservados codificados URL uma vez que o HTML é gerado:

 $src = <<  Bar   EOS; // Create DOM document $dom = new DOMDocument(); $dom->loadHTML($src); // Alter `href` attribute of anchor $a = $dom->getElementsByTagName('a') ->item(0) ->setAttribute('href', 'https://stackoverflow.com/questions/29448119/how-can-i-prevent-html-entities-with-php-a-domdocumentsavehtml/{{{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; 

Saída (indentada por clareza):

    Bar