質問させて下さい。
WindowsにてAtivePerlの5.8.6.811を使っています。
サーバはAnHttpdです。
htmlの文章ファイルを読み込んで、空白行で区切ってリストに読み込み、そのリストを配列ごとに正規表現で検索して、マッチしたものだけをhtmlで表示しようとしています。
ところが、検索結果にどうにも変な時があります。
少し試したところ、「ゲーム」「ラッキー」などの「ー」が入る文字を検索しようとすると、全く処理をしてくれないのです。
その上、そのパターンマッチ検索のスクリプトより下に書いた行が全て実行されなくなってしまいます。
Shift-JISで書いているので、ダメ文字の類なのかとも思い、シングルクォートで囲ったり、「ー」の後に\をいれてみたりもしましたが、変化ありません(十や表はこれでうまくいきました…)。
また、それ以外にも、「スイス」などという、絶対に書かれていない単語で検索しても、検索されてしまう配列があったりします。
これに至っては完全に謎です…。
分かる方がいらしたら、どうかよろしくお願いします。
No.2ベストアンサー
- 回答日時:
正規表現マッチにiをつけると
スとベ
イとツ
の区別がつかなくなります
”ベツベ”、”ベイス”、”スイベ”などにもマッチすることになります。
あとquotemeta()の代わりに
f($_ =~ m/"\Q$kensaku\E"/im){print "$_","\n\n";}
という書き方も出来ます。
ご回答ありがとうございます!
大変参考になりました。
確かに、スイベでもヒットします…。そしてベイスという文字が検索された配列の中にありました。
iを付けると、そんな落とし穴もあったのですね…。
回避する方法はなさそうですね…
でも、原因が分かっただけでもすっきりしました。
どうもありがとうござました!
No.4
- 回答日時:
#テストスクリプトを書いてみました。
use Encode;
#$buffer="search=%E3%82%B9%E3%82%A4%E3%82%B9";# search="スイス" by charset="UTF-8"
$buffer="search=%E3%82%B2%E3%83%BC%E3%83%A0";#search="ゲーム"
my @pairs = split(/&/,$buffer);
foreach $pair (@pairs){
my($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$kensaku = $value;#quotemeta($value);←特別必要ない
}
#文字コード指定をして内部コードに変換
#$kensaku=Encode::decode("Shift_JIS",$kensaku);#Shift_JISの場合
$kensaku=Encode::decode("UTF-8",$kensaku);#UTF-8の場合
#binmode STDOUT,":encoding(shiftjis)";#出力の文字コードの指定、不要な場合は不要
open DB, "<:encoding(UTF-8)","(songbook.html";#文字コードを指定して読み込む
@db = <DB>;
$db = <<"EOL";
@db
EOL
close DB;
@db2 = split(/\n \n/,$db);
foreach (@db2){
if($_ =~ m/$kensaku/im){print "$_\n\n";}
}
No.1
- 回答日時:
どんなふうに書いていますか?
マルチバイト文字を扱う場合は、
encoding 指定をするとか、
Encode::decode とかで内部文字列表現に変えてやらなくちゃ生データ文字列のままだと正しく動作しませんよ。
この回答への補足
不要な行ものせてしまったので、こちらでお願いします。
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
print <<"EOM";
Content-type: text/html\n\n
<html><head><style type="text/css"><!--a:hover{color:eeeeee;background-color:#b2946c}.1{border-bottom-style:solid;color=tan;width=100%}A { text-decoration: none; }--></style></head><body bgcolor="#eeeeee" link="#b2946c" vlink="#aaaaaa" leftmargin="30"><font color=52340c><pre>
EOM
my @pairs = split(/&/,$buffer);
foreach $pair (@pairs){
my($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$kensaku = quotemeta($value);
}
open DB, "<(songbook.html";
@db = <DB>;
$db = <<"EOL";
@db
EOL
@db2 = split(/\n \n/,$db);
foreach (@db2){
if($_ =~ m/$kensaku/im){print "$_","\n\n";}
}
print <<"EOM";
<a href="(songbook.html">戻る</a>
</body></html>
EOM
ご回答ありがとうございます!
ですが、すみません、quotemeta関数というものを使ってみたら、「ー」を使った時のエラーの方は解決しました。
あとは、「スイス」で検索されてしまう配列がある問題だけです…。
色々、対照実験のように文字を変えてやっていますが、「スキス」「スイカ」「ザイス」などでは検索されません。なのに「スイス」だけはどうやっても検索されてしまいます…。
恥ずかしながら参考までにスクリプトをのせます…。とても汚いですがすいません…。
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
print <<"EOM";
Content-type: text/html\n\n
<html><head><style type="text/css"><!--a:hover{color:eeeeee;background-color:#b2946c}.1{border-bottom-style:solid;color=tan;width=100%}A { text-decoration: none; }--></style></head><body bgcolor="#eeeeee" link="#b2946c" vlink="#aaaaaa" leftmargin="30"><font color=52340c><pre>
EOM
my @pairs = split(/&/,$buffer);
foreach $pair (@pairs){
my($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$kensaku = quotemeta($value);
}
open DB, "<(songbook.html";
@db = <DB>;
$db = <<"EOL";
@db
EOL
@db2 = split(/\n \n/,$db);
foreach $_(@db2){
if($_ =~ m/$kensaku/im){print "$_","\n\n";}
}
print <<"EOM";
$kensaku
<a href="(songbook.html">戻る</a>
</body></html>
EOM
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Excel(エクセル) Excelでの検索結果を含む行だけを表示させたい 5 2023/03/10 17:08
- Excel(エクセル) VLOOKUP が機能しない、その原因は何 ? 8 2022/10/19 12:06
- Excel(エクセル) 【Excel】指定のセル内容を基に別シートのセルを検索して選択する【VBA】 1 2022/06/16 16:16
- Access(アクセス) Access 複数条件検索の設定が上手く行きません 1 2022/07/22 20:37
- Excel(エクセル) Vlookup関数で#N/Aエラー表示について 3 2022/09/03 20:59
- その他(コンピューター・テクノロジー) 正規表現の置換で一部の文字列をそのまま残したい 2 2022/05/03 19:19
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Visual Basic(VBA) VBA初心者です 検索した数字の行に色をつける 5 2023/02/13 14:22
- SEO 検索エンジン反映遅い 1 2022/06/04 07:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JSONで文字列が長い時
-
メモリをアドレスを直接指定し...
-
フォームで入力した値を表示し...
-
Application.ScreenUpdating = ...
-
構造体の各データの表示につい...
-
I2C接続のLCDディスプレイを使う
-
swift 文字コードから文字に変...
-
セレクトボックスである項目を...
-
[python] 文字列を変数名として...
-
ACCESS テキストボックスを隙...
-
セレクトメニューで選んだ値を...
-
python print文のエラー
-
ホームページビルダーのメール...
-
C# GetFilesで複数のファイルの...
-
どちのほうがすきですか?
-
Pythonでターミナルに文字を出...
-
sendmailで本文が文字化けします
-
pythonの*
-
複数のIP取得
-
Sendmailの文字化けについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JSONで文字列が長い時
-
メモリをアドレスを直接指定し...
-
【C#】数値の範囲チェックについて
-
map(STL)でinsertを行いたいで...
-
リロード後にプルダウンの選択...
-
フォームで入力した値を表示し...
-
Perlでアルファベットを数...
-
linq で 楽天ウェブサービスのX...
-
入力内容のチェック・・・『ま...
-
途中まで出来ているのですが‥(D...
-
CGI(Perl)で、Net::FTPを使いたい
-
前のページへ戻ったときのプル...
-
パターンマッチで変数でマッチ...
-
セレクトボックスについて
-
CGIやPHPで外部ファイルの内容...
-
デコードできない時があります><
-
Application.ScreenUpdating = ...
-
どちのほうがすきですか?
-
formで特定のinputを送信しない...
-
Pythonでターミナルに文字を出...
おすすめ情報