php5.2.2の正規表現に関する質問です。

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

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

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/03/18 12:29:33
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:rouge_2008 No.2

回答回数595ベストアンサー獲得回数351

ポイント70pt

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

他6件のコメントを見る
id: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文字でも含むと通さなくなります。)

2012/03/18 00:16:06
id:seadwell

こんにちは。
沢山検証してもらってありがとうございます。
バイトコードでの動作も確認しました。
いろんな例を見ることはとても勉強になります。

> ※バイトコードのパターンを利用する場合は、'server'を指定する必要があります。
ありがとうございます。
私なら間違いなくはまる個所です。

addElementで'hierselect'を使用しているのですが、それではjavascriptが生成されていますが、他の個所では一切作成されないんですよね。
でも、この質問はとりあえず終了します。
本当に助かりました。

2012/03/18 12:28:44

その他の回答1件)

id:oil999 No.1

回答回数1728ベストアンサー獲得回数320

ポイント30pt

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

id:seadwell

たびたびありがとうございます。
しかし、修正したコードでもpearでワーニングが出ます。
> $pattern に含まれていないためではありませんか。
$patternに含まれる文字だけ通過させたいのです。

やっとコードの見方が解りました。
便利なサイトを教えていただいてありがとうございます。

2012/03/17 19:19:00
id:rouge_2008 No.2

回答回数595ベストアンサー獲得回数351ここでベストアンサー

ポイント70pt

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

他6件のコメントを見る
id: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文字でも含むと通さなくなります。)

2012/03/18 00:16:06
id:seadwell

こんにちは。
沢山検証してもらってありがとうございます。
バイトコードでの動作も確認しました。
いろんな例を見ることはとても勉強になります。

> ※バイトコードのパターンを利用する場合は、'server'を指定する必要があります。
ありがとうございます。
私なら間違いなくはまる個所です。

addElementで'hierselect'を使用しているのですが、それではjavascriptが生成されていますが、他の個所では一切作成されないんですよね。
でも、この質問はとりあえず終了します。
本当に助かりました。

2012/03/18 12:28:44
  • id:rouge_2008
    'hierselect'も追加してみましたが、こちらでは問題なく動作しました。
    次のページの「3 つの select 要素からなる hierselect 要素を作成する」のコードをそのまま使用。
    http://pear.php.net/manual/ja/package.html.html-quickform.html-quickform-hierselect.php

    問題の解消方法は分かりませんでしたが、'hierselect'と一緒に使用する事は可能なようですので、他の要素の追加をコメントアウトで一時的に無効にするなどして、フォームの項目を少なくして動作を確認してみてください。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません