2016-11-09 2 views
2

Ich versuche, eine Vorlage, die eine TWIG-Datei mit dem DOM in PHP sein wird. So stelle ich das DOM und kratzen die Seite, die ich die Vorlage bin immer aus:Wie setze ichAttribute mit Sonderzeichen eines DOMDocument-Knotens in PHP?

$dom = new DOMDocument('1.0'); 
$dom->loadHTMLFile('http://theurl.com'); 

dann ändern ich das src eines Skripts und speichern Sie die Vorlage aus:

foreach ($domNode->childNodes as $node) { 
    $node->setAttribute('src', "{{ asset('path/to/asset.js') }}"); 
} 
$pageHtml = $dom->saveHTML(); 

$ pageHtml wird dann gespeichert out als TWIG-Datei:

file_put_contents('path/to/file.twig', $pageHtml); 

Wenn ich diese Datei aussehen, ich habe jetzt als Skript-Tag:

<script src="%7B%7B%20asset('path/to/asset.js')%20%7D%7D"></script> 

Was muss ich haben, ist:

<script src="{{ asset('path/to/asset.js') }}"></script> 

Also muss ich es tun URL-Codierung irgendwie stoppen. Irgendeine Möglichkeit, dies zu tun?

+0

Können Sie vielleicht stattdessen saveXML verwenden? Das zeigt dieses Verhalten nicht. (Aber fügt einen XML-Prolog hinzu, nicht sicher, ob das ein Dealbreaker sein wird.) – CBroe

Antwort

2

Ich kenne keine Möglichkeit, diese Prozentcodierung zu vermeiden.

Eine Möglichkeit, dies zu lösen, könnte darin bestehen, die codierten Zeichen vor dem Speichern zu ersetzen, z.

$pageHtml = $dom->saveHTML(); 
$pageHtml = preg_replace('|="%7B%7B%20(.*?)%20%7D%7D"|', '="{{ $1 }}"', $pageHtml); 
+0

Ich habe dies als Standardantwort festgelegt und upvoted, da es meine Antwort in einen 1-Liner geändert hat, werde ich mit ein paar kleinen Änderungen aktualisieren dass es mehr als src entspricht. – MicWit

0

So ist die einzige Antwort, die ich im Moment habe, ist $ pageHtml zu ändern, bevor es in die TWIG-Datei mit einem preg_replace zu senden:

$pageHtml = preg_replace("|=\"%7B%7B%20asset|", "=\"{{ asset", $pageHtml); 
$pageHtml = preg_replace("|\)%20%7D%7D\"|", ") }}\"", $pageHtml); 

Die erste Zeile wird den Start Asset-Tag ersetzen und Die zweite Zeile das Ende Asset und wird CSS, Javascript und andere Bereiche, die ein Asset-Tag verwenden können.

Ich fühle mich, als ob dies nicht die sauberste Option ist, aber im Moment ist es die sauberste Option, die ich finden kann, die funktioniert. Wenn jemand eine bessere Option finden kann, werde ich es als Antwort festlegen.