2013-11-20 20 views
7

Die besten Antworten, die ich für dieses Problem finden konnte, sind mit XSLT, aber ich bin mir nicht sicher, wie diese Antworten auf mein Problem angewendet werden.Vermeiden Sie Prozent-Encoding href Attribute bei der Verwendung von PHP DOMDocument

Grundsätzlich erledigt DOMDocument die URLs (in href Attribute), die übergeben werden, aber ich benutze es tatsächlich, um eine Twig/Django Stylevorlage zu erstellen, und ich würde es lieber in Ruhe lassen . Hier ist ein konkretes Beispiel, illustriert das „Problem“:

<?php 
$doc = new DOMDocument(); 
$doc->loadHTML('<html><body>Test<br><a href="{{variable}}"></a></body></html>'); 
echo $doc->saveHTML(); 

Welche gibt die folgenden:

<html><body>Test<br><a href="%7B%7Bvariable%7D%7D"></a></body></html> 

Ist es möglich, NICHT Prozent codieren die href Attribut?

Wenn es nicht möglich ist direkt kann vorschlagen, dass Sie eine präzise und zuverlässige Abhilfe? Ich mache andere Verarbeitung, und die Verwendung von DOMDocument wird bleiben müssen. Also vielleicht ein Pre/Post-Processing-Trick?

+0

DOM ist für ein vorhandenes Dokument zu manipulieren, sondern auch für Gebäude Ein neues Dokument von Grund auf, es ist besser, nur Zeichenfolgenoperationen zu verwenden, besonders wenn Sie eine "Vorlage erstellen, die wie HTML aussieht". –

+0

Ich manipuliere tatsächlich ein vorhandenes Dokument. Dies ist der kürzest mögliche Beispielcode, der das Problem klar veranschaulicht. –

+0

Im Wesentlichen wäre die in diesem Beispiel verwendete Zeichenfolge über 'file_get_contents()', * zum Beispiel * geladen worden. –

Antwort

2

Ich bin nicht zufrieden mit der ‚Hack‘/Kanal-Tape-Lösung, aber das ist, wie ich zur Zeit das Problem zu lösen:

function fix_template_variable_tokens($template_string) 
{ 
    $pattern = "/%7B%7B(\w+)%7D%7D/"; 
    $replacement = '{{$1}}'; 
    return preg_replace($pattern, $replacement, $template_string); 
} 

$html = $doc->saveHTML(); 
$html = fix_template_variable_tokens($html); 
+0

Ja, aber das ist besser als die 'urldecode' Lösung: D – Epoc