2010-11-19 10 views
1

大きなファイルがあるので、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。

無効なバイトがバッファの最後から始まり、次のフィルタリングの開始時に終了するこのフィルタは機能しますか?この状況は可能ですか?

+0

あなたは何をしようとしていますか?あなたは不正な形式のUTF-8サブシーケンスを取り除こうとしていますか(一般的には悪い考えです。代替文字で置き換えるべきですが、これは別の話題です)、あるいは有効なUTF-8シーケンスで操作したいが、それはXMLで違法です(ほとんどのC0制御コードなど)? – Artefacto

+0

私は整形されていないUTF-8 usbsequenceを削除したいし、XMLでは不正な文字を削除したい。 – prostynick

+0

UTF-8ファイルではないUTF-8ファイルはどのように入手しましたか?そこで停止し、あなたのgivensを再考してください。彼らは意味をなさない。 – tchrist

答えて

2

いいえ、私はうまくいかないと思います。複数のバケットに分割されたコードユニットの有効なシーケンスを削除します。

最後に不完全なシーケンスを消費してはならない(必要であれば、何も渡さずにPSFS_FEED_MEを返す)。

+0

問題は、その状況を見つけるのに適切な正規表現を見つけるのは難しいです。もう一つは、有効なコードシーケンスを削除するということです。違法なコードシーケンスを取り除くことは可能でしょうか? – prostynick

+1

@proいいえ、不正なシーケンスは、分離されたときに決して合法的なシーケンスにならないので、不正なシーケンスを取り除くことはできません。その理由は、Unicode仕様では、有効なリードバイト(またはASCII範囲のバイト)が不正なシーケンスの一部と見なされることはないということです。 – Artefacto

+0

@pro正規表現を使用することはお勧めしません。ユニコード仕様の表3-7は、ここでお役に立ちます:http://www.unicode.org/versions/Unicode6.0.0/ch03.pdf – Artefacto

関連する問題