ラテン語/表意文字 (中国語/日本語/韓国語) が混在する全文検索のために、正規表現を使用して一部の入力をサニタイズ/フォーマットしようとしています。
フォーラムでラテン語/アジア語の文字列をサニタイズしようとする誰かの試みの古い例を見つけましたが、これは二度と見つけることができません (このコードの元の作成者への完全なクレジット)。
関数の正規表現部分を完全に理解するのに苦労しています。特に、数字0、2、および3をラテン語ベースの数字1,4-9とは異なる方法で扱っているようです(基本的に数字0、 4-9 は適切に処理されますが、クエリ内の数字 0、2-3 はアジア文字として扱われます)。
例えば。次の文字列をサニタイズしようとしています:
"hello 1234567890 引き取った abc123def"
「hello 1 456789
abc1 def 2 3 0 蓄積した 2 3」
このサニタイズされた文字列の正しい出力は次のようになります:
"hello 1234567890 蓄積した abc123def"
ご覧のとおり、アジア文字のスペースは適切に配置されていますが、数字 0、2、3 は他のすべての数字とは異なる方法で処理されています。正規表現がこれらの数値 0、2、および 3 を異なる方法で処理する理由についてのヘルプは、大きな助けになります (または、同様の結果を達成するためのより良い方法を知っている場合)! ありがとうございました
以下の関数を含めました
関数 prepareString($str) { $str = mb_strtolower(trim(preg_replace('#[^\p{L}\p{Nd}\.]+#u', ' ', $str))); return trim(preg_replace('#\s\s+#u', ' ', preg_replace('#([^\12544-\65519])#u', ' ', $str) . ' . implode(' ' , preg_split('#([\12544-\65519\s])?#u', $str, -1, PREG_SPLIT_NO_EMPTY)))); }
更新: 明確にするためにコンテキストを提供する
中国で立ち上げ予定のウェブサイトをオーサリングしています。この Web サイトには検索機能があり、検索クエリ入力用のパーサーを作成しようとしています。
文中の単語間の区切り文字として " " を使用する英語とは異なり、中国語では単語間にスペースを使用しません。このため、各漢字を分解し、データベース内で各文字を個別に検索して、検索クエリを再フォーマットする必要があります。中国のユーザーは、中国語の文字と組み合わせることができるブランド名などにラテン語/英語の文字も使用します (例: Ivy牛仔舖)。
私がやりたいのは、すべての英単語を漢字から切り離し、各漢字をスペースで区切ることです。
検索クエリは次のようになります: Ivy牛仔舖</p>
そして、次のように解析したいと思います: Ivy 牛 仔 舖</p>