2011-11-12 9 views
11

PHPで有効な文字以外の文字を削除しようとしています。私はこれを使用しています:RegEx:文字以外のUTF-8をすばやく削除する

$content=preg_replace('/[^\pL\p{Zs}]/u', '', $content); 

しかし、それは痛いほど遅いです。およそ30倍より長くとります。

$content=preg_replace('/[^a-z\s]/', '', $content); 

私は、大量のデータを扱っていますので、本当に遅いメソッドを使用するのは不可能です。

これを行う方法はありますか?

+0

PHPで唯一の選択肢は 'mb_ereg_replace'ですが、それはさらに遅くなります。 ( 'iconv'拡張子は文字フィルタリングを提供せず、他のものは知らない) – mario

+2

'/'^ [p \ p {Zs}] +/u'のように' ?少し上手くいくはずです。 – NullUserException

答えて

4

特定のコードポイントがレターであるかどうかをチェックするときには、ちょうどa-zよりも約1000倍多くの文字を考慮する必要があることがわかりました。あなたが正規表現ビットを向上させることができ、言っ

$content=preg_replace('/[^\pL\p{Zs}]+/u', '', $content); 

は、1つの置換操作に隣接する非文字/スペースセパレータを組み合わせることで、それをスピードアップする必要があります。

2

--enable-jitオプションを使用して、新しいPCRE 8.20バージョンを使用できます。それは正規表現をコンパイルし、あなたのパフォーマンスを向上させるかもしれないJITです。

関連する問題