http://q.hatena.ne.jp/1331698160の続きなのですが、やはり自分で考えたものは正常に動作しませんでした。
全角の@など通過します。
もう一度アドバイスをお願いします。
また、そもそも\xe3とか\x82はどこからきているのでしょうか?
http://ash.jp/code/code.htm
など見ているのですが全然わかりません。
こちら合わせアドバイスいただければ幸いです。
『全角カタカナ, 半角スペース, 全角スペース, 半角英数字, 全角英数字, 半角シングルクオーテーション, 全角シングルクオーテーション』のみ通すようにしたいのでしょうか?
addRuleで'client'を指定するのでしたら、次のようにした方がいいと思います。
$pattern = '/^[ァ-ヶー A-z0-9A-z0-9\' ’]+$/'; $form->addRule('item_name', '文字が正しくありません', 'regex', $pattern, 'client');
※javascriptでは、バイトコードによるマッチはされませんでした。(何らかの方法で出来るのかもしれませんが、javascriptのコードが自動生成される以上、今回のような場合は仕方ないと思います。)
次のコードを実行してみてください。
<script type="text/javascript"> <!-- var str = 'ブック'; var regex = /^(\xe3(\x82[\x81-\xbf]|\x83[\x80-\xb6]))+$/; var regex2 = /^[ぁ-ン]+$/; if(regex.test(str)) { alert('バイトコードでマッチしました。'); } else if(regex2.test(str)) { alert('文字列でマッチしました。'); } else { alert('マッチしません。'); } //--> </script>
http://q.hatena.ne.jp/1331698160#a1136844 の私の解答に誤りがありました。申し訳ありません。以下のように修正してください。
$pattern = '/^(\xe3(\x82[\xa1-\xbf]|\x83[\x80-\xb6]|\x83\xbc)|(\xef(\xbc[\x90-\x99]|[\xa1-\xba])|(\xbd[\x81-\x9a]))| | |\'|’|[a-zA-Z0-9])+)$/';
$pattern に含まれていないためではありませんか。
当方の環境はPHP 5.4.0 ですが、以下のパターンではキャッチアップできました。
$pattern = '/^(\xe3(\x82[\xa1-\xbf]|\x83[\x80-\xb6]|\x83\xbc)|(\xef(\xbc[\x90-\x99]|[\xa1-\xba])|(\xbd[\x81-\x9a]))| | |@|\'|’|[a-zA-Z0-9])+)$/';
UTF-8の第1バイトです。
以下のコード表が見やすいです。
http://orange-factory.com/sample/utf8/code3-e3.html
たびたびありがとうございます。
しかし、修正したコードでもpearでワーニングが出ます。
> $pattern に含まれていないためではありませんか。
$patternに含まれる文字だけ通過させたいのです。
やっとコードの見方が解りました。
便利なサイトを教えていただいてありがとうございます。
『全角カタカナ, 半角スペース, 全角スペース, 半角英数字, 全角英数字, 半角シングルクオーテーション, 全角シングルクオーテーション』のみ通すようにしたいのでしょうか?
addRuleで'client'を指定するのでしたら、次のようにした方がいいと思います。
$pattern = '/^[ァ-ヶー A-z0-9A-z0-9\' ’]+$/'; $form->addRule('item_name', '文字が正しくありません', 'regex', $pattern, 'client');
※javascriptでは、バイトコードによるマッチはされませんでした。(何らかの方法で出来るのかもしれませんが、javascriptのコードが自動生成される以上、今回のような場合は仕方ないと思います。)
次のコードを実行してみてください。
<script type="text/javascript"> <!-- var str = 'ブック'; var regex = /^(\xe3(\x82[\x81-\xbf]|\x83[\x80-\xb6]))+$/; var regex2 = /^[ぁ-ン]+$/; if(regex.test(str)) { alert('バイトコードでマッチしました。'); } else if(regex2.test(str)) { alert('文字列でマッチしました。'); } else { alert('マッチしません。'); } //--> </script>
上記のパターンだと一部のひらがなが混じっていました。
すみません。正しくは以下になります。(「\x82[\x81-\xbf]」を「\x82[\xa1-\xbf]」に訂正)
$pattern = '/^(\xe3(\x82[\xa1-\xbf]|\x83[\x80-\xb6\xbc]|\x80\x80)|\xef(\xbc([\x90-\x99]|[\xa1-\xba])|\xbd[\x81-\x9a])|\xe2\x80\x99|[\x20\x27\x30-\x39\x41-\x5a\x61-\x7a])+$/';
一応こちらのパターンも動作するようにグループ化の位置を修正してみました。
$pattern = '/^(\xe3(\x82[\xa1-\xbf]|\x83[\x80-\xb6]|\x83\xbc)|\xef(\xbc([\x90-\x99]|[\xa1-\xba])|\xbd[\x81-\x9a])| | |\'|’|[a-zA-Z0-9])+$/';
※バイトコードのパターンを利用する場合は、'server'を指定する必要があります。
※テストしてみた結果ですが、1バイトの文字ならjavascriptでもバイトコードによる判定が可能のようです。(全角の判定ができないらしく、1文字でも含むと通さなくなります。)
こんにちは。
沢山検証してもらってありがとうございます。
バイトコードでの動作も確認しました。
いろんな例を見ることはとても勉強になります。
> ※バイトコードのパターンを利用する場合は、'server'を指定する必要があります。
ありがとうございます。
私なら間違いなくはまる個所です。
addElementで'hierselect'を使用しているのですが、それではjavascriptが生成されていますが、他の個所では一切作成されないんですよね。
でも、この質問はとりあえず終了します。
本当に助かりました。
上記のパターンだと一部のひらがなが混じっていました。
すみません。正しくは以下になります。(「\x82[\x81-\xbf]」を「\x82[\xa1-\xbf]」に訂正)
一応こちらのパターンも動作するようにグループ化の位置を修正してみました。
2012/03/18 00:16:06※バイトコードのパターンを利用する場合は、'server'を指定する必要があります。
※テストしてみた結果ですが、1バイトの文字ならjavascriptでもバイトコードによる判定が可能のようです。(全角の判定ができないらしく、1文字でも含むと通さなくなります。)
こんにちは。
2012/03/18 12:28:44沢山検証してもらってありがとうございます。
バイトコードでの動作も確認しました。
いろんな例を見ることはとても勉強になります。
> ※バイトコードのパターンを利用する場合は、'server'を指定する必要があります。
ありがとうございます。
私なら間違いなくはまる個所です。
addElementで'hierselect'を使用しているのですが、それではjavascriptが生成されていますが、他の個所では一切作成されないんですよね。
でも、この質問はとりあえず終了します。
本当に助かりました。