はじめまして。早速ですが・・・。
CGIで文字列検索し、検索語にマッチした場合その文字を抜き出すという処理をしているのですが、違うところでマッチングしてしまいます。
(プログラム、CSVデータともにEUCです。)
たとえば・・「海」を検索語として検索した場合、「~こむ~」という部分でマッチしてしまいます。
おそらく「海:[B3A4]」「こむ:[A4B3][A4E0]」でEUCコードになっている為、B3A4でマッチしているんだと思います。

何か有効な検索処理等はないものでしょうか?
よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

誰でも悩むところだと思います。



参考URLのところが、そのまま答えになってます。jperl を使う以外は、
すっきりした解決方法はない(*)です。

  (*) より、正確に言えば、私は知らない


ちなみに、参考URLに示したところは、結構使いでが有ります。
perl を良く使うのであれば、ブックマークに保存しておくように :-)

参考URL:http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
早速参考にさせていただきました。
参考にする前よりマッチの精度は比較的大きく上がりました。
が、やっぱりいくつかはへんちくりんなところでマッチしちゃいます。
やっぱり完全なマッチはきびしーのかなぁー。

お礼日時:2001/04/18 21:21

jcode.pl中のjcode'tr()などは試されましたか?



Perlインタプリタ自体に手を加えられるのであれば、jperlパッチを当てるという手段もありますが。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。
ところですいませんがjcode'tr()の機能を使用したことがありません。
早速勉強してみますが、どのようなjcode'tr()には活用方法があるのでしょうか??
文字列を最初から1文字ずつマッチさせていくような機能??
大変申し訳ありませんがよろしくお願い致します。

お礼日時:2001/04/18 20:19

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

このQ&Aと関連する良く見られている質問

Qパターンマッチで変数でマッチさせるには?

教えて下さい。
パターンマッチで変数$aaa(中身は2バイト文字)でマッチしたいのですが
どう書いたらいいんでしょう?

以下のように書いたらマッチしませんでした(;ω;)

if($value[5] =~ /^($aaa)/)

Aベストアンサー

以下のように書いたら、マッチ!しました
use encoding "Shift_JIS";

@value=("日本", "美国", "中国", "台湾", "ソ連", "韓国");

$aaa="韓国";

if($value[5] =~ /^($aaa)/){
print "マッチ!";
} else {
print "アンマッチ!";
}

Q[警告 : ページの有効期限切れ]

Perlで日記のスクリプトを書いています。

通常にアクセスしたページから、<form>タグの、POST方式で管理人のパスワードと管理人モードに行くよという情報を送って、まず管理人画面に入ります。
GET方式に直すと

diary.cgi?mode=admin&pass=abcd

といった感じです。
さらに管理人画面にて、新規投稿や既存の記事の削除および編集ができるようになっていまして、その記事編集をする場合は、管理人画面にてさらにPOST方式を使って編集画面へとうつります。ここでのPOST送信は分けあってJavascriptを使っています。
編集画面に移動するボタンは、削除用のフォームの中にあり、しかしフォームを入れ子構造にすることはできなく、かといってリンク等で(記事noが69の記事の場合)

<a href="diary.cgi?no=69&mode=edit&pass=abcd">この記事を編集</a>

という風にGet送信すると、履歴にパスワードなどがのったURLが残ってしまうから、Javascriptを使わざるを得なかったわけです。

また、編集し終わると、もとの管理人の画面に戻ります。

そこで困ったことに、編集した後などにブラウザの「戻る」や、「進む」繰り返し押したりすると、
************************************
警告 : ページの有効期限切れ
要求したページは、フォームで送信された情報を使用して作成されました。このページは、もう利用できません。セキュリティ保護のため、情報は自動的には再送信されません。
*************************************

という風に表示されてしまいます。
これは致命的です。
しかし何がいけないのかさっぱり見当がつきません。

ただし、編集画面へ行くときにリンク等でGET方式で送信するとこの症状が出ません。

なにがいけないのでしょうか。
限られた文字数と、サンプルソースは長すぎて載せられないため、状況をうまく説明できていませんが、不明な点があればご指摘下さい。

Perlで日記のスクリプトを書いています。

通常にアクセスしたページから、<form>タグの、POST方式で管理人のパスワードと管理人モードに行くよという情報を送って、まず管理人画面に入ります。
GET方式に直すと

diary.cgi?mode=admin&pass=abcd

といった感じです。
さらに管理人画面にて、新規投稿や既存の記事の削除および編集ができるようになっていまして、その記事編集をする場合は、管理人画面にてさらにPOST方式を使って編集画面へとうつります。ここでのPOST送信は分けあってJavascriptを使って...続きを読む

Aベストアンサー

multipart/form-dataの場合、Locationヘッダを利用することで回避したことがあります。
例えば、hoge.cgiへmultipart/form-dataでPOSTした場合・・・

[一般的なhoge.cgiの処理]
1) POSTデータを aaa.jpg で保存し
2) imgタグとかでaaa.jpgを表示して終了 ← これが問題のページ

[Locationでの回避策]
1) POSTデータを aaa.jpg で保存後
2) いきなりLocationヘッダで http://~/hoge.cgi?img=aaa.jpg へ飛ばし
3) imgタグとかでaaa.jpgを表示して終了 ← 単に飛ばされてきたページなので問題発生せず

つまりは、POSTデータで生成されたページは「ページの有効期限切れ」になるので表示しないというやりかたです。(こんな処理は面倒なので、なにか別の策があるなら知りたい)

単にパスワードが丸見えになるのがイヤでPOSTしているだけでしたら、
パスワードを暗号化(ハッシュ化)するなり、Cookieを利用するなりして丸見え対策したほうが近道かも。

multipart/form-dataの場合、Locationヘッダを利用することで回避したことがあります。
例えば、hoge.cgiへmultipart/form-dataでPOSTした場合・・・

[一般的なhoge.cgiの処理]
1) POSTデータを aaa.jpg で保存し
2) imgタグとかでaaa.jpgを表示して終了 ← これが問題のページ

[Locationでの回避策]
1) POSTデータを aaa.jpg で保存後
2) いきなりLocationヘッダで http://~/hoge.cgi?img=aaa.jpg へ飛ばし
3) imgタグとかでaaa.jpgを表示して終了 ← 単に飛ばされてきたページなので問題発生せず

...続きを読む

Q[携帯サイト]CGIの対応キャリアについて

初めまして。
私は今までWebサイトは構築したことがありましたが、今回携帯サイトを初めて構築することになりました。

htmlで順調に構築してまいりましたが、会員登録ページなどのユーザからの入力データを受け取る部分はCGIで対応しようと思いました。
しかし、シュミレータで動作確認を行ったところ、docomo以外は対応していないと表示され、非常に困っています。
docomoでは正常にデータが受け取れているのでプログラムは正しいと思います。

いろいろ調べた結果、「CGIは3キャリア対応している」と私は解釈したのですが、実際はどうなのでしょうか?
”~.cgi”というファイルを閲覧可能なキャリアはdocomoだけなのでしょうか?
なにぶん初心者なため、質問内容が初歩的なものとなってしまっているかもしれませんが、ご回答宜しくお願い致します。


なお、使用したシュミレータは以下のとおりです。
docomo:i-mode HTML Simulator II
softbank:ウェブコンテンツヴューア
au:Openwave SDK 6.2K

初めまして。
私は今までWebサイトは構築したことがありましたが、今回携帯サイトを初めて構築することになりました。

htmlで順調に構築してまいりましたが、会員登録ページなどのユーザからの入力データを受け取る部分はCGIで対応しようと思いました。
しかし、シュミレータで動作確認を行ったところ、docomo以外は対応していないと表示され、非常に困っています。
docomoでは正常にデータが受け取れているのでプログラムは正しいと思います。

いろいろ調べた結果、「CGIは3キャリア対応している」と私...続きを読む

Aベストアンサー

ウェブでの通信手順 HTTP について誤解があります。まずは入門書で HTTP を勉強するところからはじめるのがいいです。
お勧め: 上野 宣 (著) 「今夜わかるHTTP」
http://www.amazon.co.jp/%E4%BB%8A%E5%A4%9C%E3%82%8F%E3%81%8B%E3%82%8BHTTP-%E4%B8%8A%E9%87%8E-%E5%AE%A3/dp/4798108200/sr=8-1/qid=1172018022/ref=sr_1_1/503-8526841-4624764?ie=UTF8&s=books

誤解の一番重要なところを説明します。

ウェブは
「http://..../~.cgi のデータをください」
「<html>
...

と、サーバはデータだけ送っているものだと思っていませんか?

実際の動作は
「http://..../~.cgi のデータをください」
「OK です。
 ファイルの内容は text/html です
 ファイルのサイズは xxxxx bytes です
 最終更新日時は ..... です
 (一行空白を置いて)
 <html>
...

という動作をしています。その URL のデータについての情報がデータ本体の前に送信されています。これを「HTTP レスポンスヘッダ」と呼びます。PC のブラウザ(IE, Firefox, Opera, Safari, etc)でもデフォルト状態では表示されませんが、確かにありますし、実は重要です。

先ほどの例で「ファイルの内容は text/html です」という項目を入れました。ウェブでのファイルの種類の区別は本来は HTTP レスポンスヘッダで行うものなんです。例えば「ファイルの内容は text/plain です」と書いてしまうと拡張子が .cgi でも .html でもプレインテキストとして扱う -HTML のつもりがソースコードが表示される- のが本来の規定です。

> ”~.cgi”というファイルを閲覧可能なキャリアはdocomoだけなのでしょうか?
”~.cgi” という名前はクライアントには関係ないんです。

.html や .gif を送るときには管理者は気にしません。ウェブサーバが自動でファイルの種類の行を作るからです。拡張子が問題になるのは、ほとんどのウェブサーバが HTTP レスポンスヘッダを作るときに参照しているからです。

しかし CGI の場合はプログラマが自分で HTTP レスポンスヘッダのファイルの種類の行を作らなければなりません。CGI は HTML, GIF, JPEG, PNG, TXT, etc のどれでも作成できるので、ウェブサーバが自動でファイルの種類の行を作ることができないからです。

PC 向けではうまくいったしれません。IE は HTTP レスポンスヘッダのファイルの種類の行を見ない、しかも拡張子も見ない、実はデータの内容を調べて処理している(例えば <html> が見つかったら HTML として表示する)、ことを Microsoft がドキュメントで説明しています。試しに HTML を拡張子 .txt でウェブサーバにおいて IE で表示させてみてください。HTML として表示されるはずです。後は .gif でも .jpg でも .swf でも何でもいいです。デフォルト設定の IE ではなんだろうと HTML として表示します。(IE 6 以降は設定で変えられます)

HTTP レスポンスヘッダを見るには、ツールを持っているサイトを使うか、自分でツールをインストールするか、です。

私が知っているのは
View HTTP Request and Response Header
http://web-sniffer.net/
# サイトの URL を入力すると HTTP レスポンスヘッダも含めて表示されます
Live HTTP headers
http://firefox.geckodev.org/index.php?cmd=read&page=Live%20HTTP%20headers&word=response%20header
# Firefox の機能拡張です

自分で確かめてくださるようお願いします。

ウェブでの通信手順 HTTP について誤解があります。まずは入門書で HTTP を勉強するところからはじめるのがいいです。
お勧め: 上野 宣 (著) 「今夜わかるHTTP」
http://www.amazon.co.jp/%E4%BB%8A%E5%A4%9C%E3%82%8F%E3%81%8B%E3%82%8BHTTP-%E4%B8%8A%E9%87%8E-%E5%AE%A3/dp/4798108200/sr=8-1/qid=1172018022/ref=sr_1_1/503-8526841-4624764?ie=UTF8&s=books

誤解の一番重要なところを説明します。

ウェブは
「http://..../~.cgi のデータをください」
「<html>
...

と、サーバはデータ...続きを読む

Q[Perl] unpackで不要文字にエンコード

Perl CGIについてです。
文字列をエンコードしようと次のようにしてみました。

$val1 =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
$val2 =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;

$va1は問題なくエンコードされ、デコードも元文字に戻ったのですが、
$va2のエンコード文字に不要な'25'が含まれるようになってしまいました。

例:「ガム」をエンコード >> %A5%AC%A5%E0 
を期待していたのですが、結果は %25A5%25AC%25A5%25E0

と不要に'25'が含まれてしまいました。unpackの文が悪いのでしょうか?ご教示ください。

Aベストアンサー

> 重にエンコードというと$val1でunpackした結果が要因したのでしょうか?

ちがいます。
多分euc-jpを使っていると思いますが、それだと
“ガム”は A5 AC A5 E0 ですよね。
で、これを質問にあるエンコーディングで変換すると

%A5%AC%A5%E0 

となります(期待している結果でもありますが)。
ここで、さらにこれに対して同じ処理を加えると

%25A5%25AC%25A5%25E0

になりますので、「二重にエンコーディングをかけていないか?」
と書いたのです。
#% は %25 に変換され、その他はそのままになります

ということなので

> デコードすると文字として「%%A5%AC%A5% E0」が表示され、本来の「ガム」が

ここでデコードしているつもりでもう一回エンコードしているんじゃないでしょうか?

変換しないでそのまま出すとどうなりますか?

Q[Perl] CGI_Lite.pmでファイル名取得できない

CGI_Lite.pmを使用してファイルをアップロードするCGIを書いていますが、ファイル名によっては、名前の途中までが消えてしまいます。
cgiとhtmlは、以下のとおりです。EUC、Shif-JISの両方で、また、LinuxとWindowsXPの両方で試してみました。


「可能性.txt」というファイルをアップすると、
「性.txt」というファイル名になります。

環境:
CGI_Lite.pmは、2つのバージョンを試してみました。
(1), CGI_Lite 2.02 http://search.cpan.org/~smylers/CGI-Lite-2.02/Lite.pm
(2), CGI_Lite 1.8 http://search.cpan.org/dist/CGI_Lite/

OSなど
(1), WindowsXP + AnHTTPd + Perl5.8.8
(2), SuSE Linux + Apache2.0 + Perl5.8.3



■アップするHTML
<html>
<form action='test.cgi' ENCTYPE='multipart/form-data' method='post'>
<input type="file" name="file1">
<input type="submit">
</form>
</html>

■アップされるCGI(test.cgi)
#!/usr/bin/perl
use CGI::Lite;

my $cgi=new CGI::Lite;
$cgi->add_timestamp(0);
$cgi->set_directory('./') or die $!;
$cgi->set_platform ('Unix');
$cgi->set_buffer_size (10000);
my %in = $cgi->parse_form_data();

print"Content-type: text/html\n\n";
print"-->$in{'file1'}\n";



以上、よろしくお願いします。

CGI_Lite.pmを使用してファイルをアップロードするCGIを書いていますが、ファイル名によっては、名前の途中までが消えてしまいます。
cgiとhtmlは、以下のとおりです。EUC、Shif-JISの両方で、また、LinuxとWindowsXPの両方で試してみました。


「可能性.txt」というファイルをアップすると、
「性.txt」というファイル名になります。

環境:
CGI_Lite.pmは、2つのバージョンを試してみました。
(1), CGI_Lite 2.02 http://search.cpan.org/~smylers/CGI-Lite-2.02/Lite.pm
(2), CGI_Lite 1.8 http...続きを読む

Aベストアンサー

sjisのまま扱いたいということなら、

ShiftJIS 「脳」の文字コード -OKWave
http://okwave.jp/qa3306321.html

の回答 No.2 にあるようなパターンで、ダメ文字の中に隠れている
'\' をエスケープすればうまくいきませんか?

デバッグのときなんかはいろいろ見落としがちですからね。
謝るこたないですよ♪


このカテゴリの人気Q&Aランキング

おすすめ情報