我正在使用PHP DOMDocument库来创建一个'脚本'标记元素,带有一个javascript值,并将其插入DOM中。
这就是我的所作所为:
$scriptElement = $doc->createElement('script',$scriptTagVal);
echo $scriptElement->nodeValue;
$someNode->parentNode->insertBefore($scriptElement,$postRttScriptNode);
这与我期望的方式相同,它在“someNode”之前插入一个元素。然而,它做了一些奇怪的事情,它混淆了&符号(&)。单个&符号(&)不存在,双&符号(&&)被购买到单个&符号。
疯狂?好吧,我试过这样做:
$scriptElement = $doc->createElement('script','return "undefined" !== typeof b **&&** null !== b ? b.getAttribute("content") : 0');
如果我回显$ scriptElement-> nodeValue,
我得到了
return "undefined" !== typeof b **&** null !== b ? b.getAttribute("content") : 0'
我假设这几乎闻所未闻,但我尝试使用包含双&符号的值创建不同的元素。类似的东西:
$scriptElement = $doc->createElement('p','Why does DOMDocument obfuscate double
ampersands(&&)');
输出到我浏览器的结果是
标签,其值为:
为什么DOMDocument会混淆双倍 号(
也许特殊人物?无论如何我可以解决这个问题吗?我的意思是,肯定有一种方法可以使用DOMDocument在HTML中插入javascript,对吗?
答案 0 :(得分:7)
如http://www.php.net/manual/en/domdocument.createelement.php
所述该值不会被转义。使用DOMDocument :: createTextNode()来 创建一个带有转义支持的文本节点
你可以尝试:
$doc = new DomDocument();
$scriptContent = 'return "undefined" !== typeof b **&&** null !== b ? b.getAttribute("content") : 0';
$scriptElement = $doc->createElement('script');
$scriptElement->appendChild($doc->createTextNode($scriptContent));
$doc->appendChild($scriptElement);
echo $doc->saveXML();
在构建文本节点时,您可能需要使用$doc->ownerDocument->createTextNode()
,这是未经测试的,因为我没有可运行的代码段。