すべての漢字を取り出す正規表現<UTF-8
2009年5月15日 [ TIPS, TIPS - その他 ]GoogleのWebMasterを見ていて気が付いたのだが、サプリインデックスの「水溶性食物繊維」や「不溶性食物繊維」がNOT FOUNDできちんとインデックスされていない。
なぜ!?
実はサプリメントの成分はいままでデータベース内にファイル名という項目を作り、動的アドレスを静的アドレスに変更していた。
でも、もしかして…と思い、Wikiと同様に静的アドレスを日本語のURLエンコードで
http://www.supplement.ne.jp/db/不溶性食物繊維
などのように変更してみたのだが…。
そのときの.htaccessのmod_writeの記述は(一部)
RewriteEngine on
RewriteRule ^([ぁぁ-んぁ-ヶ亜-黑A-Za-z0-9]*)$ hoge.php?name=$1 [L]
つまり、すべてのマルチバイト文字にマッチングするようにしていた
(シングルバイト文字に非マッチングしている理由は、MySQLの脆弱性を回避するため)。
この、「亜-黑」はすべての漢字にマッチングすると信じ込んでいたのだが…。
実はこれはSJISのみの場合だった。
なんとも、初歩的なミスであるが、UTF-8では、これではすべての漢字にマッチングしない。
てことで、いろいろ調べた結果、UTF-8でのマッチングは
一-龠
が、正しいらしい。
う~ん、独学・自己流だといろいろとたいへんだわさ。
ひらがな・カタカナのマッチングがいまいち自信がないのだけど…。とりあえず、今のところ不具合はでていないようなので放置。本当は、
ぁ-んァ-ヴー
こんな風に書くのだろうか?
※ちなみに、UTF-8ではマルチバイト文字などという概念はないので、全角か半角か…ということなのだが、詳しくは割愛。このへんあたりが参考になるかな?
PHPにおけるUnicode文字列の正規化










