문자열 "XML safe"는 어떻게 만드나요?
PHP 에코를 통해 XML 문서를 전송하여 AJAX 호출에 응답합니다.이 XML 문서를 작성하기 위해 데이터베이스의 레코드를 루프합니다.문제는 데이터베이스에 '<' 기호가 있는 레코드가 포함되어 있다는 것입니다.따라서 당연히 브라우저는 특정 지점에 오류를 발생시킵니다.어떻게 고칠 수 있을까요?
PHP 5.4에서는 다음을 사용할 수 있습니다.
htmlspecialchars($string, ENT_XML1);
다음과 같이 인코딩을 지정해야 합니다.
htmlspecialchars($string, ENT_XML1, 'UTF-8');
갱신하다
위의 경우 변환되는 것은 다음뿐입니다.
&
로로 합니다.&
<
로로 합니다.<
>
로로 합니다.>
큰따옴표로 둘러싸인 속성에서 사용하기 위해 텍스트를 이스케이프하는 경우:
htmlspecialchars($string, ENT_XML1 | ENT_COMPAT, 'UTF-8');
"
로로 합니다."
에에 to in &
,<
★★★★★★★★★★★★★★★★★」>
.
속성이 작은 따옴표로 둘러싸인 경우:
htmlspecialchars($string, ENT_XML1 | ENT_QUOTES, 'UTF-8');
'
로로 합니다.'
에에 to in &
,<
,>
★★★★★★★★★★★★★★★★★」"
.
(물론 Atribut외에서도 사용할 수 있습니다).
htmlspecialchars 에 대해서는, 메뉴얼의 엔트리를 참조해 주세요.
를 사용하여 이러한 문자를 이스케이프하거나, 보다 적절하게는 DOMDocument 또는 XMLWriter 등의 XML 문서를 작성하기 위해 라이브러리를 사용합니다.
다른 방법으로는 섹션을 , CDATA의 ]]>
.
또한 XML 문서에 대해 정의한 인코딩(기본값 UTF-8)을 준수해야 합니다.
1) 다음과 같이 텍스트를 CDATA로 래핑할 수 있습니다.
<mytag>
<![CDATA[Your text goes here. Btw: 5<6 and 6>5]]>
</mytag>
http://www.w3schools.com/xml/xml_cdata.asp 를 참조해 주세요.
2) 이미 누군가가 말했듯이:그 검댕이들을 피해라.예:
5<6 and 6>5
이것을 시험해 보세요.
$str = htmlentities($str,ENT_QUOTES,'UTF-8');
'필터링하다'를 사용해서 를 필터링을 한 htmlentities()
로 사용할 수 있습니다.
<mytag>$str</mytag>
가능하면 문자열 조작이 아닌 XML 클래스를 사용하여 XML을 작성하는 것이 좋습니다.이 중 하나의 장점은 필요에 따라 클래스가 자동으로 문자를 이스케이프한다는 것입니다.
누군가에게 도움이 될지도 모르니까 이걸 추가하는 것.
일본어 문자를 사용하고 있기 때문에 인코딩도 적절히 설정되어 있습니다. 그런 생각이 요.htmlentities
★★★★★★★★★★★★★★★★★」htmlspecialchars
충분하지 않습니다.
일부 사용자 입력에는 위의 기능으로 제거되지 않은 특수 문자가 포함되어 있습니다.이 경우 다음을 수행해야 합니다.
preg_replace('/[\x00-\x1f]/','',htmlspecialchars($string))
한 것것은 this this this this this this 。xml-unsafe
를 제어하다Null character
또는EOT
. 이 표를 사용하여 생략할 문자를 결정할 수 있습니다.
나는 Golang이 XML을 위해 이스케이프를 인용하는 방식을 선호한다(그리고 newline 이스케이프, 다른 문자 이스케이프 등 몇 가지 추가 사항). 그래서 나는 아래의 PHP에 XML 이스케이프 함수를 포팅했다.
function isInCharacterRange(int $r): bool {
return $r == 0x09 ||
$r == 0x0A ||
$r == 0x0D ||
$r >= 0x20 && $r <= 0xDF77 ||
$r >= 0xE000 && $r <= 0xFFFD ||
$r >= 0x10000 && $r <= 0x10FFFF;
}
function xml(string $s, bool $escapeNewline = true): string {
$w = '';
$Last = 0;
$l = strlen($s);
$i = 0;
while ($i < $l) {
$r = mb_substr(substr($s, $i), 0, 1);
$Width = strlen($r);
$i += $Width;
switch ($r) {
case '"':
$esc = '"';
break;
case "'":
$esc = ''';
break;
case '&':
$esc = '&';
break;
case '<':
$esc = '<';
break;
case '>':
$esc = '>';
break;
case "\t":
$esc = '	';
break;
case "\n":
if (!$escapeNewline) {
continue 2;
}
$esc = '
';
break;
case "\r":
$esc = '
';
break;
default:
if (!isInCharacterRange(mb_ord($r)) || (mb_ord($r) === 0xFFFD && $Width === 1)) {
$esc = "\u{FFFD}";
break;
}
continue 2;
}
$w .= substr($s, $Last, $i - $Last - $Width) . $esc;
$Last = $i;
}
$w .= substr($s, $Last);
return $w;
}
이 때문에 적어도 PHP7.2가 필요합니다.mb_ord
사용방법이나 다른 폴리필로 교환해야 하는데, 이 기능들은 우리에게 매우 효과적입니다!
궁금하신 분들을 위해 관련 Go 소스 https://golang.org/src/encoding/xml/xml.go?s=44219:44263#L1887를 소개합니다.
언급URL : https://stackoverflow.com/questions/3426090/how-do-you-make-strings-xml-safe
'programing' 카테고리의 다른 글
범용 메서드를 사용하는 경우 및 와일드 카드를 사용하는 경우 (0) | 2022.12.29 |
---|---|
.class용 Java 동기 블록 (0) | 2022.12.29 |
문자열 목록을 어떻게 정렬합니까? (0) | 2022.12.29 |
JavaScript에서 지연, 약속 및 미래의 차이점은 무엇입니까? (0) | 2022.12.29 |
XAMPP 제어판 v3.2.1에서 VMware 포트 오류 443을 중지하는 방법 (0) | 2022.12.29 |