大きなファイルがあるので、XMLから無効なutf-8文字を削除するフィルタを作成しました。PHP:フィルターで無効なutf-8文字を削除する
class ValidUTF8XMLFilter extends php_user_filter {
protected static $pattern = '/([\x09\x0A\x0D\x20-\x7E]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})|./x';
function filter($in, $out, &$consumed, $closing)
{
while ($bucket = stream_bucket_make_writeable($in)) {
$bucket->data = preg_replace(self::$pattern, '$1', $bucket->data);
$consumed += $bucket->datalen;
stream_bucket_append($out, $bucket);
}
return PSFS_PASS_ON;
}
}
このフィルタは、xmlでもutf-8でも無効なだけでなく、utf-8文字も削除します。 正規表現はMultilingual form encodingです。クラスはこの回答から取られました:How to skip invalid characters in XML file using PHPそして書き直されました。その答えのパターンは無効なutf-8文字では機能しません。 0x1D。
無効なバイトがバッファの最後から始まり、次のフィルタリングの開始時に終了するこのフィルタは機能しますか?この状況は可能ですか?
あなたは何をしようとしていますか?あなたは不正な形式のUTF-8サブシーケンスを取り除こうとしていますか(一般的には悪い考えです。代替文字で置き換えるべきですが、これは別の話題です)、あるいは有効なUTF-8シーケンスで操作したいが、それはXMLで違法です(ほとんどのC0制御コードなど)? – Artefacto
私は整形されていないUTF-8 usbsequenceを削除したいし、XMLでは不正な文字を削除したい。 – prostynick
UTF-8ファイルではないUTF-8ファイルはどのように入手しましたか?そこで停止し、あなたのgivensを再考してください。彼らは意味をなさない。 – tchrist