• ベストアンサー

正規表現でカンマを対象にする方法

フォームから入力された値をCSVにはき出しているため、 「,」(カンマ)を禁止文字としたいのですが、 正規表現で対象にすることは可能でしょうか? 「.」(ピリオド)なら  if($TEST1 =~ /\./) とすればよいと思うのですが、、、  if($TEST1 =~ /\,/) ではダメですよね。 正規表現で引っかけてアラートを出す予定なのですが、 if($TEST1 =~ /\,/){ print <<END; <script> alert(",(カンマ)を含んでいます"); </script> END &error; } 他のやり方で「,」(カンマ)を禁止文字にする方法でも構いません。 また、入力フォームは8つあるのですが($TEST1~$TEST8)、 まとめて「,」(カンマ)を禁止文字にすることはできますか? 開発環境:WindowsXP(TeraTerm使用) サーバー:HP-UX perlバージョン:5.6.1 以上、よろしくお願いいたします。

  • Perl
  • 回答数5
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

長文失礼します #4は出勤前にあわてて書いたので 間違いがあります 仕事を終えて帰宅しましたので、じっくり調べてみました ようやく答えらしい事が書けます。 結論から先に、、、 入力されたデータ全てから  , をチェックするのなら 良くあるFORMデコード部分で foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value, 'sjis');# sjisまたはEUCのどちらか if(index($value, ',')){エラー処理をここに記述;}#この行を追加する $FORM{$name} = $value; } ##その理由は http://ash.jp/code/ を見て調べたところ 2Cを含むのはShift_JISでもEUCでもなく JISとUTF-16でした。 朝、調べたのはwindows付属の文字コード表でしたが これってデフォルトがShift_JISではなくてunicodeになっているんですね で、JISの場合 2C を含む2バイト文字は10個やそこらではないので、 URLデコード前やsjisやEUCに変換する前に 2C (1バイト文字だと , )をチェックするのは現実的ではありません。 また<FORM LANG="JA"ACCEPT-CHARSET="Shift_JIS" のような指定をしても入力されるCHARSETはブラウザの実装しだいなので当てになりません。 したがってjcode.plなどでShift_JISかEUCに変換後チェックする必要があります。 ### 追伸1: 何故#4が間違いかと言うと、上に書いた現実的でない事の他に、 2Cを含む2バイト文字と , そのものが混在した場合、チェックをスルーしてしまうからです。 ### 追伸2:#2さんへ #3にて理解できないと書きましたが、これって FORM入力データをデコードしてハッシュに入れた後で展開して調べるって事ですね? 失礼しました。

kal1119
質問者

お礼

ご回答ありがとうございました。 上記参考にさせてもらい、解決いたしました。 以上ですm(__)m

その他の回答 (4)

回答No.4

すみません #3のスクリプトでは、Shift_JISの場合 倬匬听のような2Cを含む文字を入力されると誤動作しますね。 これを回避するには if($valueに倬匬听などの2cを含む文字があれば何もしない elsif(,を含む場合){エラー処理} みたいな形しかオイラには思いつかない もっとスマートな形があると思うのだが、、、

回答No.3

/,/ でもOKですよね。 サンプル $u='a,b,c,d,e,f'; $u =~/,/; print "\$&=$& \$u=$u<P>\n"; $u =~s/,//g; print "\$&=$& \$u=$u"; で、いっぺんにチェックするのは FORM入力データコーディングのループ中で $value =~ s/%([a-f\d]{2})/pack("C", hex($1))/ieg;# と言う行があるはずなので、次の行に if(index($value, ',')){&error(",は駄目よ ");last;}# sub errorに飛ぶ 等と追加する とすれば良いかと思います。 と言うか、、、#2さんのソースを見て俺には理解できなかったのだが , をFORMで送るとURLエンコードされて %2C になるはずだが、その点は大丈夫なんですか? perl離れて何年も経つので勘違いしてたらごめんなさい

  • agharta
  • ベストアンサー率52% (54/103)
回答No.2

存在するかどうかなので、 index($TEST1, ',') の方が早そうです。 フォームからということなので、 変数をハッシュに入れ込んで、for文で回して フラグをたてて、エラー処理をすると コーディングの行数が減りそうですね。 my %form; #= $form{"$key"} = $val;の様な感じで使用する。 my $flg = 0; #= フラグ foreach my $key (keys %form) { if ( index($form{"$key"}, ',' ) { $flg++; last; } } if ( $flg > 0 ) { #= エラー処理 } ってかんじでしょうか?

kal1119
質問者

お礼

ご回答ありがとうございました。 違う方法ですが、解決いたしました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

カンマが含まれていることの正規表現は /\,/ でも /,/ でもOKだと思います。 >if($TEST1 =~ /\,/) ではダメですよね。 のダメな理由はなんですか? まとめてやるのは、ループにするなり、 結合しちゃってやるなりすればすればいいと思いますが、 script でalert を出すんだったら、最初からscript で入力チェックするというのもありかと思います。

kal1119
質問者

お礼

ご回答ありがとうございました。 違う方法ですが、解決いたしました。

関連するQ&A

  • 正規表現の記載方法

    どなたかお知恵をお貸し下さい。 PHPの正規表現で、 6文字以上20文字以下 英数字 -(ハイフン _(アンダーバー) ,(カンマ) .(ピリオド) 最初の1文字目はアルファベット というものを表現したいです。 お知恵をお貸し下さい。 お願いいたします。

    • ベストアンサー
    • PHP
  • これは正規表現とは言えないでしょうか?

    正規表現を勉強しようと思っているのですが まずはじめに確認させて下さい。VBAです。 Sub 正規表現() If a Like "*a*" Then End If End Sub は正規表現とは言えないでしょうか? *を使っているからそう思いました。 Dim re As RegExp Set re = New RegExp を使わないと、正規表現といえないのでしょうか? よろしくお願い致します。

  • 正規表現

    正規表現を使って、数字、大文字小文字のアルファベット、「”」(ダブルコーテーション)、「、」コンマ以外の記号を、表せる正規表現方法はどうなるのでしょうか? 見当がつきません。 どなたかお願いします。

    • ベストアンサー
    • Java
  • rubyの正規表現で"["を使いたいのですが、正しく実行できません

    rubyの正規表現で"["を使いたいのですが、正しく実行できません #! ruby -Ks a ="test[test" b ="test[" if /#{b}/ =~ a print "hit" end エラー内容は test.rb:4: invalid regular expression; '[' can't be the last character ie. can't start range at the end of pattern: /test[/ (RegexpError) "\["と文字を入力することで解決するかと思いましたが上手くいきませんでした。 rubyのバージョンは1.8.2です。宜しくお願いいたします。

    • ベストアンサー
    • Ruby
  • phpの正規表現について

    phpの正規表現についてです。 よく入力されたメール・パスワードを判定するのに正規表現で判定させますが、今回の指定する条件は… ・半角英数、0~9の組み合わせ ・使用禁止文字は \ ' @ [ ] の5つ ・入力は8文字以内 例 if(ereg("^[0-9a-z\!\"\#\$\%\&\(\)\=\-\~\|\{\}\;\:\+\*\,\.\/\<\>\?\_]{1,8}$", $pw)){ 記号の意味でよくわからないのがあるのですが、 { }は文字数を指定するものでよろしいのでしょうか? {1,8} は1~8文字までという意味? \が入ると認証が通ってしまってい、困っています。 ユーザーの入力    MySQLの取得結果 例 123\        → データが入らない   \123        → 123   \\123        → \123   123\123      → 123123   \\          → \ といった不具合になってしまい、MySQL側でも入力されたデータと異なったデータが入ってしまいます。\が入っても認証されないようにするにはどうすればいいんでしょうか? 正規表現の参考にしたサイトは http://itbtech.itboost.co.jp/php/php_06.php です。アドバイスよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 正規表現

    正規表現について勉強中です。 先頭2文字をたとえばYQで入力させたい場合は どうマッチさせればよいのでしょうか? if string.match(/^YQ|[0-9]/) == null { nullの場合の処理 } としていますが、うまくいきません。 正規表現についてはまったくの初心者ですので、 笑わないでくださいね。

  • 正規表現について

    こんにちは 正規表現を勉強中のものです 数字がカンマで連結された文字列(例:352549,352998,352933,352698,28309)を 調べる為の正規表現がわからなく困っております。 例の数字部分に、数字とカンマ以外が入っていたらfalseを返すようにしたいのですが、 「^[0-9\,]+$」 で対応できるかと思ったのですが、思い通りに行かず困っております。 わかる方がおられましたら、ご教授お願いできますでしょうか。 よろしくお願いいたします。

  • javascriptでの正規表現について

    javascript正規表現にて正の整数および小数(半角のみ) を判別したいのですがうまくいきません。どうすればいいのでしょうか。<script language=javascript> function StrCheck(strSrc){ var value = strSrc.value; if (value.match(/[0-999]+¥.[0-99]/)==true){ alert("半角数字のみで入力して下さい"); } </script> ); 以上のようにつくってみましたが、半角でも全角でも「半角を入力してください」というメッセージがでてしまいます。これを全角のみでエラー表示がでるようにしたいのですがどうしたらよいのでしょうか。参考になるWEBページでもあれば教えてください。ご教授の程よろしくお願い申し上げます。

  • preg_matchでの コンマ について 

    phpでの正規表現で 「もしも変数$wordへ入力した文字列が Japan's という文字列に一致すれば」というスクリプトを作成しましたが、うまくいきません。 if(preg_match("/japan\'s/i",$word,$match)){ この Japan's における カンマの取り扱いを このケースではどうしたらいいかよくわかりません。 \' としてみましたが、うまくいきません。 なにかアドバイスやヒントがありましたら、よろしくお願いします。 ああでもない、こうでもないとやってみましたが、その過程で 唯一 Japan's にヒットしたのは、次のスクリプトでした。 if($word=="japan\'s") ただし、これは正規表現は使っていないわけですよね。 なにか、自分のローカル環境に問題があるのかと思い、レンタルサーバーに同じものをuploadして試して見ましたが、やはり結果は同じで、ヒットしませんでした。別のパソコンでもやってみましたが、結果は同じでした。 整理しますと、 (preg_match("/japan's/i",$word,$match) ではヒットせず、よって コンマの前に\をつけて(preg_match("/japan\'s/i",$word,$match) としましたが、これもヒットしなかったということになります。 1) (')は正規表現の特殊文字でないはずですから、そのまま使えるはずだと思いましたが、なぜかこれが使えない。 2) しかも、その前にエスケープの \ をつけても、そのエスケープ が効かないのはなぜか。 追記: 最近分かったこと。 おもしろいことに、 'j すると、hitする。でも、j' とするとヒットしない。 ということは、コンマ自体には問題ないのだろうと推測しています。でも、文字の後にコンマがつくと、preg_matchにとって特別な意味を持つ文字列に変わるのではないか。

    • ベストアンサー
    • PHP
  • ACCESS VBAでの正規表現チェックについて

    いつもお世話になっています。 現在ACCESS2003で開発を行っているのですが、文字の入力チェックで悩んでいます。 正規表現チェックを使用し 半角英数字と"-", "_", "!", "@", "+", "/", "*"以外の文字が入力されればエラーメッセージを表示させようとしているのですが、うまく動作しません。 ●現在の処理 '検証結果フラグ b_error = True '入力許可文字列 s_ok_text = "*[”正規表現”]*" '入力文字列が空で無い場合はチェック処理を実行する If Not IsNull(”入力文字”) Then If ”入力文字” Like s_ok_text Then '入力許可文字列以外が含まれていた場合はエラーを返す b_error = False End If End If s_ok_textに入力可能文字を設定しているのですが、上記入力許可文字の設定の仕方がわからない状況です。 正規表現のチェックに詳しい方がいましたら、上記チェックの方法をご教授頂きたく思います。 宜しくお願い致します。