이 문자 때문에 : &
관련 HTML 엔티티로 바꾸어야합니다. &
번역을 수행하려면 htmlspecialchars 기능을 사용할 수 있습니다. nodeValue 특성에 쓰는 중 값을 이스케이프해야합니다. 2005 년에 버그 보고서에서 인용 한 바와 같이 속성는 TextContent를 설정할 때 here
앰퍼샌드가 제대로 인코딩에 위치. 불행하게도 텍스트 문자열이 선택적인 두 번째 항목으로 으로 전달되면 인코딩되지 않습니다. DOMElement :: createElement 텍스트 노드를 만들고 textContent를 설정 한 다음 노드를 새 요소에 추가해야합니다.
htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
이
는 번역 테이블 :
'&' (ampersand) becomes '&'
'"' (double quote) becomes '"' when ENT_NOQUOTES is not set.
"'" (single quote) becomes ''' (or ') only when ENT_QUOTES is set.
'<' (less than) becomes '<'
'>' (greater than) becomes '>'
반복적으로 번역 할 것이 스크립트 :
<?php
function clean($type) {
if(is_array($type)) {
foreach($type as $key => $value){
$type[$key] = clean($value);
}
return $type;
} else {
$string = htmlspecialchars($type, ENT_QUOTES, 'UTF-8');
return $string;
}
}
$data = array(
'data' => array(
'root' => array(
array(
'@id' => 'A & B: OK',
'name' => 'C & D: OK',
'sub1' => array(
'@id' => 'E & F: OK',
'name' => 'G & H: OK',
'sub2' => array(
array(
'@id' => 'I & J: OK',
'name' => 'K & L: OK',
'sub3' => array(
'@id' => 'M & N: OK',
'name' => 'O & P: OK',
'sub4' => array(
'@id' => 'Q & R: OK',
'@' => 'S & T: ERROR',
) ,
) ,
) ,
) ,
) ,
) ,
) ,
) ,
);
$data = clean($data);
출력
Array
(
[data] => Array
(
[root] => Array
(
[0] => Array
(
[@id] => A & B: OK
[name] => C & D: OK
[sub1] => Array
(
[@id] => E & F: OK
[name] => G & H: OK
[sub2] => Array
(
[0] => Array
(
[@id] => I & J: OK
[name] => K & L: OK
[sub3] => Array
(
[@id] => M & N: OK
[name] => O & P: OK
[sub4] => Array
(
[@id] => Q & R: OK
[@] => S & T: ERROR
)
)
)
)
)
)
)
)
)
나는 약간의 도우미 함수를 작성했습니다
'@id' => 'A & B: OK', // <-- Handled as plain text
'name' => 'C & D: OK', // <-- Handled as plain text
'@' => 'S & T: ERROR', // <-- Handled as raw XML
:
포장 값을 $ key, htmlspecialchars ($ childValue));'''트릭을 수행 할 것입니다. – Alliswell
@Alliswell - 질문을 다시 읽으십시오. 이 질문은 CakePHP 질문이며 DOM 함수를 직접 호출하지 않고 배열을 작성하는 것입니다. 일부 요소는 이미 이스케이프 처리 되었기 때문에 CakePHP 코어를 패치 할 수 없습니다. (자세한 내용은 대답을 참조하십시오.) –