トピック このトピックは解決済みです
TOPIC 正規表現について
Posted by きしもと
at 2010/06/13(日) 17:14
分類: カスタマイズノートサポート | AmigoDatabaseバージョン: ver9.85

AmigoDB本家サイトでも質問させて頂いておりますが、回答を得られませんのでこちらに投稿させていただきました。
2重投稿となってしまい申し訳ございません。

さて、入力項目の文字チェックにつきまして、
半角カナの入力を拒否したく、環境設定において正規表現の設定値はどのようにすれば宜しいのでしょうか?

もし、半角カナを指定出来ない場合、
「全角以外は拒否する」という条件でも可能かと思います。

どうぞ、宜しくお願いいたします。

編集: 2010/06/16(水) 16:17
トピック このトピックは解決済みです
レス表示 古い順 新しい順 | 13件のレス 1-13 表示中
RES レスメッセージ
Posted by Bear
at 2010/06/13(日) 21:17
Re:正規表現について
> No4207への引用返信
> AmigoDB本家サイトでも質問させて頂いておりますが、回答を得られませんのでこちらに投稿させていただきました。
> 2重投稿となってしまい申し訳ございません。
>
> さて、入力項目の文字チェックにつきまして、
> 半角カナの入力を拒否したく、環境設定において正規表現の設定値はどのようにすれば宜しいのでしょうか?
>
> もし、半角カナを指定出来ない場合、
> 「全角以外は拒否する」という条件でも可能かと思います。
>
> どうぞ、宜しくお願いいたします。

こんばんは。
AmigoDatabaseの標準機能では半角カナを登録制限できません。
カスタマイズではdatabase.cgiのRegistDataCheckサブルーチンを修正します。
  sub RegistDataCheck{ my($all,$nopass)=@_;
+ foreach(qw(HPName Comment)){
+     my$item=${$all}{DataName}{$_};
+     if($FORM{$_}=~/[\xA6-\xDF]/){ &Error("$itemに半角カナはご利用出来ません。"); }
+ }
  foreach(@{${$all}{Necessary}}){
※登録制限したいデータ種類名を「qw(HPName Comment)」にて指定します。複数指定する場合は半角スペースで区切ります。
Posted by きしもと
at 2010/06/14(月) 08:44
Re:正規表現について
> こんばんは。
> AmigoDatabaseの標準機能では半角カナを登録制限できません。
> カスタマイズではdatabase.cgiのRegistDataCheckサブルーチンを修正します。
>   sub RegistDataCheck{ my($all,$nopass)=@_;
> + foreach(qw(HPName Comment)){
> + my$item=${$all}{DataName}{$_};
> + if($FORM{$_}=~/[\xA6-\xDF]/){ &Error("$itemに半角カナはご利用出来ません。"); }
> + }
> foreach(@{${$all}{Necessary}}){
> ※登録制限したいデータ種類名を「qw(HPName Comment)」にて指定します。複数指定する場合は半角スペースで区切ります。

思い通りの動作確認をいたしました。
感謝いたします。
有難うございました。
Posted by きしもと
at 2010/06/14(月) 19:44
Re:正規表現について
> No4212への引用返信
>> こんばんは。
>> AmigoDatabaseの標準機能では半角カナを登録制限できません。
>> カスタマイズではdatabase.cgiのRegistDataCheckサブルーチンを修正します。
>>   sub RegistDataCheck{ my($all,$nopass)=@_;
>> + foreach(qw(HPName Comment)){
>> + my$item=${$all}{DataName}{$_};
>> + if($FORM{$_}=~/[\xA6-\xDF]/){ &Error("$itemに半角カナはご利用出来ません。"); }
>> + }
>> foreach(@{${$all}{Necessary}}){
>> ※登録制限したいデータ種類名を「qw(HPName Comment)」にて指定します。複数指定する場合は半角スペースで区切ります。
>

希望の動作確認ができたかと思われましたが、
全角文字の2バイト目に、[\xA1-\xDF] が含まれていることがあるため、正しく認識できないようです。
ですので「全角文字のみ許可」とすることはできないでしょうか?
Posted by Bear
at 2010/06/14(月) 23:43
Re:正規表現について
こんばんは。

> 希望の動作確認ができたかと思われましたが、
> 全角文字の2バイト目に、[\xA1-\xDF] が含まれていることがあるため、正しく認識できないようです。
> ですので「全角文字のみ許可」とすることはできないでしょうか?

[\xA1-\xDF]が認識できないとの意が良く分からないのですが。
私がお返事した[\xA6-\xDF]での半角カナ除外ではダメだったということですか?それとも、私がご説明したのを[\xA1-\xDF]に変更してダメだったということですか?
因みに「\xA1」は1バイトの「。」ですね。これも半角です。これらは半角カナではありませんが、除外対象に入れたいのであれば「[\xA1-\xDF]」と除外対象を広げることになります。

追加
半角(1バイト文字)全部を除外するなら「[\x00-\xFF]」とすれば出来るかと思います。

編集: 2010/06/14(月) 23:50
Posted by きしもと
at 2010/06/15(火) 08:46
Re:正規表現について
> [\xA1-\xDF]が認識できないとの意が良く分からないのですが。
> 私がお返事した[\xA6-\xDF]での半角カナ除外ではダメだったということですか?それとも、私がご説明したのを[\xA1-\xDF]に変更してダメだったということですか?

すみません。
記載ミスでした。
ご指示通りの[\xA6-\xDF]にて、例えば、ひらがなの「え」とかでも半角カナはダメと表示されます。

> 因みに「\xA1」は1バイトの「。」ですね。これも半角です。これらは半角カナではありませんが、除外対象に入れたいのであれば「[\xA1-\xDF]」と除外対象を広げることになります。
>
> 追加
> 半角(1バイト文字)全部を除外するなら「[\x00-\xFF]」とすれば出来るかと思います。
Posted by Bear
at 2010/06/15(火) 13:57
Re:正規表現について
こんにちは。

> すみません。
> 記載ミスでした。
> ご指示通りの[\xA6-\xDF]にて、例えば、ひらがなの「え」とかでも半角カナはダメと表示されます。

なるほど、ここでもShift_JISの弱点がでてきたのですね。
前にお返事したforeach文の中身を次のように修正してお試し頂けますか。
半角カナは1バイトですし、2バイト文字が出しゃばるなら、先に2バイト文字を消しちゃいましょう。その上で半角英数字やスペースなども消して、残ったもので半角カタカナのマッチにかけてみましょう。
my$item=${$all}{DataName}{$_};
my$tmp=$FORM{$_};
$tmp=~s/(?:[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])//g;
$tmp=~s/\w|\s//g;
if($tmp=~/[\xA6-\xDF]/){ &Error("$itemに半角カナはご利用出来ません。"); }

編集: 2010/06/15(火) 14:10
Posted by きしもと
at 2010/06/15(火) 14:26
Re:正規表現について
> なるほど、ここでもShift_JISの弱点がでてきたのですね。
> 前にお返事したforeach文の中身を次のように修正してお試し頂けますか。
> 半角カナは1バイトですし、2バイト文字が出しゃばるなら、先に2バイト文字を消しちゃいましょう。その上で半角英数字やスペースなども消して、残ったもので半角カタカナのマッチにかけてみましょう。
> my$item=${$all}{DataName}{$_};
> my$tmp=$FORM{$_};
> $tmp=~s/(?:[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])//g;
> $tmp=~s/\w|\s//g;
> if($tmp=~/[\xA6-\xDF]/){ &Error("$itemに半角カナはご利用出来ません。"); }
やはり、正確に判断できないようです。
例えば、
「ア」はエラーになりますが、
「アア」は文字化けしてスルーします。
「アアア」だとエラーになります。
Posted by Bear
at 2010/06/15(火) 16:24
Re:正規表現について
こんにちは。

> やはり、正確に判断できないようです。
> 例えば、
> 「ア」はエラーになりますが、
> 「アア」は文字化けしてスルーします。
> 「アアア」だとエラーになります。

ダメでしたか。申し訳ありません。
手ごわいですね。ちょっと考えてみますのでお時間を下さい。
Posted by きしもと
at 2010/06/15(火) 17:06
Re:正規表現について
> No4220への引用返信
> こんにちは。
>
>> やはり、正確に判断できないようです。
>> 例えば、
>> 「ア」はエラーになりますが、
>> 「アア」は文字化けしてスルーします。
>> 「アアア」だとエラーになります。
>
> ダメでしたか。申し訳ありません。
> 手ごわいですね。ちょっと考えてみますのでお時間を下さい。

お手数おかけ致しまして申し訳ございません。
解決策を期待しております。
Posted by Bear
at 2010/06/15(火) 19:49
Re:正規表現について
こんばんは。
発想の転換と参りましょう。
半角カナを制限するのではなく半角カナを全角カナへ変換させるというのは如何でしょうか?
foreach(qw(HPName Comment)){
    $FORM{$_}=&Jcode::convert(\$FORM{$_},'sjis','sjis','z');
}
但し、Jcode.pmを利用しますので、db-setup.cgiにてJcodeモジュールを利用可能している必要があります。
判別は行いませんのでエラーとしては返せませんが、目的が同じならこれでもいいのではと考えました。

追加
これでも文字列によって変換後に文字化けする半角カナがあるようです。もう少し調査します。

編集: 2010/06/15(火) 20:11
Posted by Bear
at 2010/06/15(火) 21:06
Re:正規表現について
こんばんは。
サーバのSTDIN(標準入力)から送信データを受け取った際にJcodeで半角カナ変換することで問題が解決出来ました。
今までご説明したカスタマイズは削除して下さい。
その上で、database.cgiのMultipartサブルーチンを修正します。
#&$JCODE(\$val,'sjis');
$val=&Jcode::convert(\$val,'sjis','sjis','z');
元の記述をコメントアウトして、新しい1文を追加します。
これもJcodeモジュールを利用します。db-setup.cgiにてJcodeモジュールを利用可能としている必要があります。
GetFormDataサブルーチンにも同様の記述がありますので、そちらも修正して下さい。

編集: 2010/06/15(火) 21:11
Posted by Bear
at 2010/06/15(火) 21:32
Re:正規表現について
こんばんは。
勝手ながら面白い結果となりましたのでカスタマイズノートにて公開させて頂きました。
http://www.cgi-search.info/amigo/db51.html
今後とも宜しくお願い致します。
Posted by きしもと
at 2010/06/16(水) 13:54
Re:正規表現について
> No4223への引用返信
> こんばんは。
> サーバのSTDIN(標準入力)から送信データを受け取った際にJcodeで半角カナ変換することで問題が解決出来ました。
> 今までご説明したカスタマイズは削除して下さい。
> その上で、database.cgiのMultipartサブルーチンを修正します。
> #&$JCODE(\$val,'sjis');
> $val=&Jcode::convert(\$val,'sjis','sjis','z');
> 元の記述をコメントアウトして、新しい1文を追加します。
> これもJcodeモジュールを利用します。db-setup.cgiにてJcodeモジュールを利用可能としている必要があります。
> GetFormDataサブルーチンにも同様の記述がありますので、そちらも修正して下さい。

確認いたしました。
この度は大変お世話になり、有難うございました。
今後とも宜しくお願いいたします。
Access: 1,220,122
 
ソーシャルブックマーク: Yahoo!ブックマーク Google Bookmarks はてなブックマーク Livedoorクリップ @niftyクリップ FC2ブックマーク Buzzurl Delicious トピックイット newsing it!