現在、xml ファイルから一重引用符を含む要素が戻ってくるという問題が発生しています。これにより、xml_parse が複数のチャンクに分割します。例: Get Wired, You're Hired! 次に、'Get Wired, You' が 1 つのオブジェクト、一重引用符が 2 番目のオブジェクト、're Hired!' として入力されます。三番目として。
私がやりたいことは次のとおりです。
while($data = fread($fp, 4096)){
if(!xml_parse($xml_parser, htmlentities($data,ENT_QUOTES), feof($fp))) {
break;
}
}
しかし、それは壊れ続けます。htmlentities の代わりに str_replace を実行でき、問題なく実行できますが、htmlentities では実行したくありません。
何か案は?
更新: 以下の JimmyJ の回答に従って、次の解決策を試みましたが、うまくいきませんでした (参考までに、リンクされた投稿の上に、直接リンクされているコードを更新する 1 つまたは 2 つの回答があります)。
function XMLEntities($string)
{
$string = preg_replace('/[^\x09\x0A\x0D\x20-\x7F]/e', '_privateXMLEntities("$0")', $string);
return $string;
}
function _privateXMLEntities($num)
{
$chars = array(
39 => ''',
128 => '€',
130 => '‚',
131 => 'ƒ',
132 => '„',
133 => '…',
134 => '†',
135 => '‡',
136 => 'ˆ',
137 => '‰',
138 => 'Š',
139 => '‹',
140 => 'Œ',
142 => 'Ž',
145 => '‘',
146 => '’',
147 => '“',
148 => '”',
149 => '•',
150 => '–',
151 => '—',
152 => '˜',
153 => '™',
154 => 'š',
155 => '›',
156 => 'œ',
158 => 'ž',
159 => 'Ÿ');
$num = ord($num);
return (($num > 127 && $num < 160) ? $chars[$num] : "&#".$num.";" );
}
if(!xml_parse($xml_parser, XMLEntities($data), feof($fp))) {
break;
}
更新:以下のトムの質問によると、魔法の引用符は実際にオフになっています。
解決策:問題を解決するために私がやったことは次のとおりです。
個々のアイテム/投稿などのデータを収集した後、そのデータを配列に保存して後で出力に使用し、収集中に使用したローカル変数をクリアします。データが既に存在するかどうかを確認するステップを追加しました。存在する場合は、上書きするのではなく、最後まで連結します。
したがって、3 つのチャンクができた場合 (上記のように、「Get Wired, You're Hired!」に固執しましょう。
$x = 'Get Wired, You'
$x = "'"
$x = 're Hired!'
すること:
$x = 'Get Wired, You' . "'" . 're Hired!'
これは最適な解決策ではありませんが、機能しているようです。