PHP DOMElement类:不要转义特殊字符

时间:2017-12-22 16:52:51

标签: php

使用DOMElement类创建文本节点以使其不会转义using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class EnemyController : MonoBehaviour { public float lookRadius = 10f; Transform target; public NavMeshAgent agent; void Start () { target = PlayerManager.instance.player.transform; agent = GetComponent<NavMeshAgent> (); if (agent.isOnNavMesh == false) Debug.Log ("NOOOOOO"); } void Update () { float distance = Vector3.Distance (target.position, transform.position); if (distance <= lookRadius){ agent.SetDestination (target.position); } } void OnDrawGizmosSelected() { Gizmos.color = Color.red; Gizmos.DrawWireSphere(transform.position, lookRadius); } } &等字符的正确方法是什么?

在生成包含JavaScript的<标记时,这尤其成问题。 <script><等运营商被转义,破坏了JavaScript代码。

1 个答案:

答案 0 :(得分:1)

您可以使用DOMDocument::createCDATASection()创建一个文本块,使用saveHtml()方法时不会转义字符。

$dom = new DOMDocument('1.0');
$root = $dom->createElement('html');
$root = $dom->appendChild($root);

$text = $dom->createCDATASection("some < text & with special characters");
$text = $root->appendChild($text);

var_dump($dom->saveHtml());

var_dump($dom->saveXml());

这将创建以下输出:

string(51) "<html>some < text & with special characters</html>
"
string(85) "<?xml version="1.0"?>
<html><![CDATA[some < text & with special characters]]></html>
"

如果您想使用saveXml()并想要使用特殊字符(对于javascript),您可能需要查看comment on DOMDocument::createCDataSection()

  

一个常见问题似乎是向CDATA添加了javascript,浏览器抛出了javascript错误。要确保javascript工作,请在添加CDATA时使用以下代码:

<?php
/**
* Append Caracter Data to a node and check for a javascript node
* 
* @param DOMElement $appendToNode
* @param string $text
*/
function appendCdata($appendToNode, $text) 
{
    if (strtolower($appendToNode->nodeName) == 'script') {  // Javascript hack
        $cm = $appendToNode->ownerDocument->createTextNode("\n//");
        $ct = $appendToNode->ownerDocument->createCDATASection("\n" . $text . "\n//");
        $appendToNode->appendChild($cm);
        $appendToNode->appendChild($ct);
    } else {  // Normal CDATA node
        $ct = $appendToNode->ownerDocument->createCDATASection($text);
        $appendToNode->appendChild($ct);
    }
}
?>
     

结果应为:

<script type="text/javascript">
//<![CDATA[
function someJsText() {
   document.write('Some js with <a href="#">HTML</a> content');
}
//]]></script>

这将创建一个有效的CDATA部分,其中CDATA语法被注释掉为javascript解析器。