電子書籍の厳選無料作品が豊富!

早速ですが、
覚えたことをメモ(形式は普通の日本語テキスト)しており、
あとから検索でキーワードを与えると該当の文章を抜き出し表示するようなcgiを作っています。
基本的には上手く行くのですが、漢字をキーワードに入れると抜き出せるときと、抜き出せないときがあります。

抜き出しは此処で教わった、
if($target =~ m/$key/i) {実行rtn
を使っています。

どのような対処が必要でしょうか。
理由と対処法を教えてください。
宜しくお願いします。

A 回答 (1件)

まず、その方法では、$keyは「正規表現」として解釈されます。


例えば、 「.」(ピリオド)を検索しようとすると、全ての文字がマッチします。

また、明示的に設定したり、昔のJperlのような改造版でも無い限り、日本語は「複数のバイト列」です。
そのため、Shift_JISで顕著な、俗に「ダメ文字」と呼ばれる問題があります。

特に、正規表現では、通常「ダメ文字」と言われる\を含む文字の他にも、メタ文字として使われる文字(|等)も対象となるので、かなりの数の文字が誤判定されます。

単に文字列が含まれるかどうかだけなら、index関数を使う方が確実です。
または、\Q$key\Eとして$key中のメタ文字から特殊な意味を無くしてしまうか。

ただ、いずれの場合でも、漢字の途中から(あるいは途中まで)マッチするケースがあります。
Encodeを使ってUnicode文字列に変換して、漢字を1文字として扱うようにした方がよいかもしれせん。

この回答への補足

お世話になります。

その後、調べたり考えたりした結果、
問題は漢字だったので、前から使っていたindexによる検索を併用して解決しました。
m//iは英字の大文字小文字混在を解決すべく変更したモノで、
漢字とは排他の関係にありますので。

unicodeは少し読んでみましたが、一からしっかり読まなくてはならないと思います。
勉強してみます。

どうも有り難うございました。

補足日時:2011/03/06 08:17
    • good
    • 0
この回答へのお礼

早速有り難うございました。
言われていることが、何となくですが、分かります。
前にも似たような質問をしたことがあり、
その時にも勉強したのですが、今ひとつ自分のものにできていません。
基礎が出来ていないからでしょう。

今回も同じようにならないため、もう少し踏み込んで勉強したいと思います。
(1)index関数
(2)\Q$key\Eとして$key中のメタ文字から特殊な意味を無くしてしまう
(3)Encodeを使ってUnicode文字列に変換する

(1)、(2)は何とか検索などで調べられ、やってみられるかなと思いますが、
(3)は何処か参考になるサイトなり、サンプルなりはありますでしょうか。

私のやりたいことからして、(3)が一番適切かなと思うのですが。
宜しくお願いします。

お礼日時:2011/03/06 07:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!