[PHP-users 23015]Re: mb系使えない環境で全角 ー を含めた文字列の検索

mooth959 @ infoseek.jp mooth959 @ infoseek.jp
2004年 8月 18日 (水) 22:46:04 JST


こんばんは、赤坂57です。
ミワさん、PHPユーザーさん、富田さん、本当に有難う御座います。

■ ミワさん

> split は正規表現で分割しますので、
> この場合は explode を使った方がいいでしょう。

はい、お恥ずかしいです。その様に致します。有難うございます!


■ PHPユーザーさん


> この場合、検索文字列に何が入るのか予想がつかないので、それを関数
> split()の引数に直接持っていくのは駄目ではないかと思います。もしど
> うしてもsplit()を使いたいのであれば、preg_quote()なんて関数があり
> ます。
> 
> ただ、既に他の方から回答がある通り、split()は正規表現を使って文字
> 列を分割しますので、正規表現を使用しない場合はexplode()の使用が推
> 奨されてますし、正規表現を使用する場合でもpreg_split()の方が一般的
> に高速であると言われていたと思います。

以前、切り分け、配列化によくexplode()を使っていたのに、鳥の脳みその
もので、ちょっと、他の言語を使うと、その時の切り分け=>split ? 
見たいになって、explode()が脳ミそのメモリから外れていました。
いえいえ、
そう言う事でなく、ミワさん、PHPユーザーさん、そして、富田さん
ご指摘の通り、”spilt()は正規表現で分割”を把握致しました!


■ 富田さん

> $kの内容の文字コードは何でしょうか。おそらくEUCならこのような問題は
> 起こらないので、SHIFT-JISではないかと思いますが、

ご指摘の通りです!実は携帯サイトとの連動を考え、そうでなければ
EUCで作るのですが、しかしこれもまた、あまり理由にはなりません。
有難う御座います。


> $kの内容がShift-JISの文字列であるとすると、以下のように
> 解釈することができます。

> キ   ー   ワ   ー   ド
> 834c 815b 838f 815b 8368    (16進表記)
>  ? L  ? [  ? ?  ? [  ? h    (ASCIIコードに則って文字に変換)
>                                 ※ASCIIコードの範囲外の文字は?とする



> 正規表現の文法上、[と]は対でなければならないはずですので、

> Warning: unexpected regex error (7) in /home/・・・
> 
> というメッセージが表示されるのだと思います。
> よって、[PHP-users 23007] [PHP-users 23006] で紹介してく
> ださっているsplitのかわりにexplodeを使うか、$kをpreg_quote()
> する方法が良いと思います。

すみません、過去のMLの検索はしたのですが、十分でありませんでした。
[PHP-users 23007] [PHP-users 23006] を参照します。
preg_quote()も試します!


> $k='キーワード;
> $fp='検索文字列';
> $sf=split(base64_encode($k),base64_encode($fp));
> 
> としても、あるはずの文字に、マッチ(切り分け)自体しませんでした。
> 
> 着想は良いのですが、Base64の特性上エンコードの際前後のバイトを
> 考慮するので、たとえば、"aキ"と"キa"をエンコードした結果は全く
> 異なる結果になります。
> 
> base64の際は、24bit(3byte)毎に4byteの文字列に変換しますので、
> 前後に別の文字が入っていると、全く別の文字に変換されます。

個別でエンコードしたものを文全体エンコードした中でさがして、
ブラウザに書き出しCTRL+Fでマッチしなかったので、
もしやと思った通りでした。ご説明でその実際がよく分かりました、
有難う御座います。

> 例:
> "aキ"61834c = 01100001 10000011 01001100
>               [ Y  ][  Y  ][  N  ][ M  ]
> 
> "キa"834c61 = 10000011 01001100 01100001
>               [ g  ][  0  ][  x  ][ h  ]
> 
> この場合は、base64_encodeの代わりにbin2hexすると想定した結果に
> なると思います。

bin2hex()やってみます!

皆さんのご丁寧なご教授、本当に深く感謝します。
有難う御座いました!!!


 
------------------------------------------------------------------------
メダルより 人間ドラマが おもしろい by infoseek
http://ap.infoseek.co.jp/athens5.html 



PHP-users メーリングリストの案内