Home > php > php4環境下でutf8の全角スペースは正規表現でmatchしない?

  • 2009.01.24 Sat 18:11

php : php4環境下でutf8の全角スペースは正規表現でmatchしない?

sugar.hacca.jpをご覧のみなさま、あけましておめでとうございます。遅い。遅すぎる。
最近はもっぱらデザインの案件やリスティング広告の案件をやっていましたので、なかなかこのブログに書くことがありませんでした。しかしながらひと月以上も更新していないでいると、なんだかむずがゆくなってきたので、以前書きかけて未公開のまま置いておいた記事を苦し紛れにアップしようと思います。
仕事先であるNPO法人彩都メディア図書館蔵書検索システムを構築中につまづいた、PHP4の正規表現に関する内容です。

何年も前から使われてきたFileMakerの蔵書データベースをphp+Mysqlで再構築しました。まずFileMakerでエクスポートしたcsvファイルがダブルクォーテーションやカンマをエスケープ処理していないものだったので、それを修正するのに手間取りましたが、その後は検索機能をはじめとしてページングなどが割とスムーズに構築できました。
ただ、複数条件(AND検索)の実装にあたり、スペースやカンマが入力されたときに区切り文字として認識する、というのに一苦労ありましたのでまとめておきたいと思います。

$titlespace=mb_convert_kana($search['title'],’s');
$titlespace=mberegi_replace(“ ”,”,”,$titlespace);
$titlespace=mberegi_replace(” “,”,”,$titlespace);
$titlespace=mberegi_replace(“,”,”%’ and title like ‘%”,$titlespace);
$title_where=”title like ‘%”.$titlespace.”%’”;

はじめはだいたいこんな感じで、「半角・全角のスペースが$titlespaceに入力されていたら半角カンマに置換し、さらにカンマを条件追加のsql文に置き換える」という流れを考えてました。ところが、これではなぜか全角スペースの場合だけうまく動きませんでした。
調べてみると、php4+文字コードがUTF-8の場合、正規表現で全角スペースをちゃんと認識できないようです。だめじゃん・・・と思いつつ調べていると

Perl 互換の正規表現の修飾子に u を入れることで UTF-8 を扱うことができますので、preg_replace() を使用すれば対処可能です。
http://ml.php.gr.jp/pipermail/php-users/2005-August/026964.html

という情報を見つけました。Perlはほとんど知りませんでしたので目から鱗。
この情報を参考に、2行目をこう書き換えるとうまくいきました。

$titlespace=preg_replace(“/ /u”,”,”,$titlespace);

めでたしめでたし。このバグ(?)はPHP5では修正されているそうです。

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://haruka.sugawa.in/note/php/74/trackback
Listed below are links to weblogs that reference
php4環境下でutf8の全角スペースは正規表現でmatchしない? from haruka.sugawa

Home > php > php4環境下でutf8の全角スペースは正規表現でmatchしない?

Return to page top