1

次の PHP スクリプトを使用して、一部のデータを xml ファイルに保存しようとしています。

<?php

$string = '<a href="google.com/maps">Go to google maps</a> and some special characters ë è & ä etc.';

$string = htmlentities($string, ENT_QUOTES, 'UTF-8');

$doc = new DOMDocument('1.0', 'UTF-8');
$doc->preserveWhiteSpace = false;
$doc->formatOutput = true;

$root = $doc->createElement('top');
$root = $doc->appendChild($root);

$title = $doc->createElement('title');
$title = $root->appendChild($title);

$id = $doc->createAttribute('id');
$id->value = '1';
$text = $title->appendChild($id);

$text = $doc->createTextNode($string);
$text = $title->appendChild($text);

$doc->save('data.xml');

echo 'data saved!';

?>

htmlentities を使用して、すべての文字列を html 形式に変換しています。これを省略すると、特殊文字は html 形式に変換されません。これは出力です:

<?xml version="1.0" encoding="UTF-8"?>
<top>
  <title id="1">&amp;lt;a href=&amp;quot;google.com/maps&amp;quot;&amp;gt;Go to google maps&amp;lt;/a&amp;gt; and some special characters &amp;euml; &amp;egrave; &amp;amp; &amp;auml; etc.</title>
</top>

HTML タグのアンパサンドは 2 つの HTML コードを取得し&amp;lt;、アンパサンドは次のようになります。&amp;amp;

これは正常な動作ですか?または、どうすればこれを防ぐことができますか?二重エンコーディングのように見えます。

4

3 に答える 3

3

次の行を削除してみてください。

$string = htmlentities($string, ENT_QUOTES, 'UTF-8');

とにかく createTextNode() に渡されるテキストがエスケープされるためです。

更新: utf-8 文字をエスケープする場合。その行を残して、$string を createElement() に直接追加してみてください。

例えば:

$title = $doc->createElement('title', $string);
$title = $root->appendChild($title);

PHPのドキュメントでは、 $string はエスケープされないと書かれています。試したことはありませんが、うまくいくはずです。

于 2012-09-08T12:25:57.960 に答える
2

この行:

$string = htmlentities($string, ENT_QUOTES, 'UTF-8');

… 文字列を HTML としてエンコードします。

この行:

$text = $doc->createTextNode($string);

… HTML の文字列を XML としてエンコードします。

これにより、HTML 文字列の XML 表現が得られます。XML が解析されると、HTML が返されます。

どうすればこれを防ぐことができますか?

目的が XML ドキュメントにテキストを格納することである場合。HTML としてエンコードする行を削除します。

二重エンコーディングのように見えます。

かなり。これは 2 回エンコードされ、2 つのパスのそれぞれに異なる (非常に似ていますが) エンコード方法を使用するだけです。

于 2012-09-08T12:51:41.447 に答える
2

aを に変換するのはhtmlentities です。xml データを扱う場合、DOMDocument は a を処理し、 を処理しないため、htmlentities を使用しないでください。&&amp;&&amp;

PHP 5.3 以降のデフォルトのエンコーディングは UTF-8 であるため、UTF-8 に変換する必要はありません。

于 2012-09-08T12:19:02.593 に答える