Avoid percent-encoding href attributes when using PHP's DOMDocument
Asked Answered
L

1

9

The best answers I was able to find for this issue are using XSLT, but I'm just not sure how to apply those answers to my problem.

Basically, DOMDocument is doing a fine job of escaping URLs (in href attributes) that are passed in, but I'm actually using it to build a Twig/Django style template, and I'd rather it leave them alone. Here's a specific example, illustrating the "problem":

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

Which outputs the following:

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

Is it possible to NOT percent-encode the href attribute?

If it's not possible directly, can you suggest a concise and reliable workaround? I'm doing other processing, and the DOMDocument usage will have to stay. So perhaps a pre/post processing trick?

Logion answered 20/11, 2013 at 17:8 Comment(3)
DOM is great for manipulating an existing document, but for building a new doc from the ground up, it's better to just use string operations, especially when you're building a "template that looks like html".Hollingshead
I am actually manipulating an existing document. This is the shortest possible sample code that clearly illustrated the problem.Logion
Essentially the string used in this example would have been loaded via file_get_contents(), for example.Logion
L
5

I'm not happy with the 'hack'/duct-tape solution, but this is how I'm currently solving the problem:

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);
Logion answered 20/11, 2013 at 19:18 Comment(1)
Yeah but this is better than the urldecode solution :DHonorific

© 2022 - 2024 — McMap. All rights reserved.