人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

php5.2.2の正規表現に関する質問です。
http://q.hatena.ne.jp/1331698160の続きなのですが、やはり自分で考えたものは正常に動作しませんでした。
全角の@など通過します。
もう一度アドバイスをお願いします。

また、そもそも\xe3とか\x82はどこからきているのでしょうか?
http://ash.jp/code/code.htm
など見ているのですが全然わかりません。
こちら合わせアドバイスいただければ幸いです。

●質問者: seadwell
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● oil999
●30ポイント

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])+)$/';

そもそも\xe3とか\x82はどこからきているのでしょうか?

UTF-8の第1バイトです。
以下のコード表が見やすいです。
http://orange-factory.com/sample/utf8/code3-e3.html


seadwellさんのコメント
たびたびありがとうございます。 しかし、修正したコードでもpearでワーニングが出ます。 > $pattern に含まれていないためではありませんか。 $patternに含まれる文字だけ通過させたいのです。 やっとコードの見方が解りました。 便利なサイトを教えていただいてありがとうございます。

2 ● rouge_2008
●70ポイント ベストアンサー

『全角カタカナ, 半角スペース, 全角スペース, 半角英数字, 全角英数字, 半角シングルクオーテーション, 全角シングルクオーテーション』のみ通すようにしたいのでしょうか?
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>


rouge_2008さんのコメント
「ヵ」や「ヶ」も必要かもしれませんので、「ァ-ン」の部分を「ァ-ヶ」に変更しました。

seadwellさんのコメント
ご回答ありがとうございます。 回答をいただいてから散々試しました。 半角英数では今のところ正常ですが、全角で正常に動きません。 全角A-zとすると、yz以外の小文字英字は通過しなくなります。 A-Za-zとすると英字は正常に認識しますが、今度は半角カナが通過します。 また0-9を指定すると全角の@や<など記号が通過します。 ABCD・・・Zabcd・・・z0123・・・9とすると正常に認識しますが相変わらず、半角カナは通過します。 並び順が正しく機能していないようですが、どのようなことが原因に考えられますか? 文字コードは間違いなくUTF-8です。

seadwellさんのコメント
> javascriptでは、バイトコードによるマッチはされませんでした 仰るとおりですね。 このようなことは初めて知りました。 勉強になります。

rouge_2008さんのコメント
もしかして'client'ではなく'server'で確認していますか? 'server'(PHPによる実行)で問題の現象を確認できました。 'server'で実行する場合は、uオプションをつけてみてください。 http://php.net/manual/ja/reference.pcre.pattern.modifiers.php >> u (PCRE_UTF8) この修正子は、Perl 非互換な PCRE の機能を有効にします。パターン 文字列は、UTF-8 エンコードされた文字列として処理されます。 この修正子は、UNIX では PHP 4.1.0 以降、Win32 では PHP 4.2.3 以降で 使用可能です。 また、PHP 4.3.5 以降では、パターンの UTF-8 としての妥当性も確認されます。 << > A-Za-zとすると英字は正常に認識 すみません。 A-zとした場合、 [ \ ] ^ _などの記号も含まれてしまいますので、A-Za-zとしてみてください。(同じ理由で半角の方も分けて記述します。) >|| $pattern = '/^[ァ-ヶー A-Za-z0-9A-Za-z0-9\' ’]+$/u'; ||<

seadwellさんのコメント
uをつけることで、やっとできました!!! ここは何日もはまっていたのでものすごく助かりました。 しかし、addRuleでは'client'を指定しているのですが何らかの理由で'client'が使えず、'server'に切り替わっているのだと思います。 javascriptが生成されていないのでおかしいなと思ったのですが。。 今から、'client'が使えない理由を探します。 とにかくありがとうございました。

rouge_2008さんのコメント
バリデーションを通過した後のフォームの凍結画面(いわゆる確認画面)では追加されていませんが、body直後(というかフォーム直前?)に次のような具合に追加されています。 javascriptによる検証が実行されないだけなのでしたら、ブラウザの設定でオフになっているのだと思いますが、コード自体が生成されない原因は思いつきません。 >|| <script type="text/javascript"> //<![CDATA[ function validate_frmTest(frm) { var value = ''; var errFlag = new Array(); var _qfGroups = {}; _qfMsg = ''; value = frm.elements['item_name'].value; var regex = /^略$/ ... ||< oil999さんのパターンでエラーが発生するのは、()によるグループ化の位置が間違っている為ではないかと思います。 こちらでもエラーが発生しますので・・・ 次のパターンを試してみてください。(ついでに半角スペース等もすべてバイトコードにしてみました。) >|| $pattern = '/^(\xe3(\x82[\x81-\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])+$/'; ||<

rouge_2008さんのコメント
上記のパターンだと一部のひらがなが混じっていました。 すみません。正しくは以下になります。(「\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文字でも含むと通さなくなります。)

seadwellさんのコメント
こんにちは。 沢山検証してもらってありがとうございます。 バイトコードでの動作も確認しました。 いろんな例を見ることはとても勉強になります。 > ※バイトコードのパターンを利用する場合は、'server'を指定する必要があります。 ありがとうございます。 私なら間違いなくはまる個所です。 addElementで'hierselect'を使用しているのですが、それではjavascriptが生成されていますが、他の個所では一切作成されないんですよね。 でも、この質問はとりあえず終了します。 本当に助かりました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ