PHP DOMDocument loadHTML将$转换为(URL编码)%24,出乎意料地。

5

对于这个 PHP 脚本,

$dom = new DOMDocument();
    $dom->substituteEntities =FALSE;
    $dom->loadHTML('<a href="$a?">$a</a>');
    // print_r ($dom->getElementsByTagName("a")->item(0)->getAttribute("href")); 

//上面的语句展示了 $a 是否正确

    echo $dom->saveHTML();

当调用saveHTML方法时,它返回<a href="%24a">$a</a>给浏览器。

在href属性中的$被转换为%24,而a标签内容中的$保持不变。我期望输出结果应该是<a href="$a">$a</a>。除了使用replace方法,还有其他方法可以实现吗?

顺便说一下,

  echo $dom->saveXML();

我使用saveXML()方法得到了我想要的内容; 但同时还有一个意外出现的<!--xml...... 谢谢


1
好的,$不是URL中有效的字符。你有特殊原因想要保留一个无效的href吗? - Wrikken
感谢您的回复,这是由于Web服务的要求。他们使用$XXX作为变量来注入他们的脚本。 - user3204729
2
嗯,没错,所以它是“几乎HTML但不完全是”的东西.. 确实很棘手。如果 HTML 片段不包含会让它偏离 XML 标准的内容,则可选用另一种方法来防止通过保存整个文档而导致 xml prologue 的问题,即通过像 $dom->saveXML($dom->documentElement); 这样的方式保存节点,但这也有其自己的怪癖和缺点。当前问题的缺点在于,如果您需要某些内容进行 url 编码,则必须对其进行双重编码。因此,选择适合您的方案吧 ;) - Wrikken
这里也有同样的问题。loadHTML方法会自动且不必要地解码元标记中的URL,例如canonical。因此,在使用此方法后,此URL上的canonical被解码为http://mathsgenius.co.za/qa/961/solve-$x-2-2x-1-0$。HTML的源代码包含了正确的canonical URL。 - Patrick Savalle
2个回答

1

在我的情况下,更安全的方法是使用:

$dom->saveXML();

-2

您可以将 echo 包装在 urldecode 中以解决此问题:

echo urldecode($dom->saveHTML());

1
如果 urldecode 解码了不必要的字符会怎么样? - Epoc
1
urldecode应该只在特定的部分进行,例如https://dev59.com/PsTss4cB2Jgan1znQsvS - Philipp Dahse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接