• 締切済み

preg_matchで全角文字のみ許可したいのですが…

ただいまphpを勉強中の初心者なのですが、 リファレンスとネットを参考に正規表現をチェックするプログラムを作っています。 今回はPHP5を使用し、 入力された値が全角文字のみかどうかを判別したいと思い、 if(!(preg_match("/^[\\x80-\\xFF]*$/", $入力値))){ print("error!全角文字以外の値が入力されています"); } というロジックを作りました。 ですが、いざ動かしてみると、 「情報」と入力した場合は問題なく動くのですが、 「正規表現」と入力した場合はエラーになってしまいます。 1文字ずつ辿ってみると、 どうも「規」と「現」という文字が引っかかってるみたいです。 いろいろ調べてみましたがこれを解決する方法が見つからず困り果てております。 解決方法があればご教授お願いいたします。 乱文お許しくださいませ。 分かりにくい文章で大変申し訳ございませんがよろしくお願いします。

  • JBKK
  • お礼率25% (1/4)
  • PHP
  • 回答数2
  • ありがとう数0

みんなの回答

回答No.2

これを正規表現で書くと、以下のようになるんじゃないでしょうか? if (preg_match("/^([\x80-\xFF][\x40-\xFF])*$/", $str)) { echo "だいじょうぶ"; } else { echo "だめっぽい"; } ただし、SJIS限定です。 ([\x80-\xFF][\x40-\xFF]) これが大雑把なSJISの文字コード範囲です。 文字コードによっても変わってくるので、使っている文字コードを書いておくと誰かが答えてくれるかも知れません。 ちょっと質問と違った答えですが、mb_convert_kanaを使って全ての半角文字を全角にしてあげる方が親切じゃないかな?と思いました。 wpさんが書かれているように、文字をバイナリとして考えてやると解かり易くて良いんじゃないかなと思いました。

JBKK
質問者

補足

回答有難うございます。 失礼しました、説明不足ですね。 そうです。おっしゃる通りSJISです。 大変参考になります。

  • wp_
  • ベストアンサー率54% (132/242)
回答No.1

Shift_JISと言う前提で話を進めますが、 >if(!(preg_match("/^[\\x80-\\xFF]*$/", $入力値))){ これだとマルチバイト文字列の二バイト目も同じ判定をされてしまうのではないですかね。 情報 8F EE 95 F1 正規表現 90 B3 8B [4B] 95 [5C] 8C BB ここの括弧が引っかかっている気がします。 mb系関数を使って文字列数検査で比較したり正規表現を使ったりするか、 preg_match()を使うのであれば、マルチバイト検出か[ぁ-ん]のような範囲指定をするべきかと思います。 実コードは書くのがだるいのでほかの人に期待するか、 「マルチバイト 正規表現」でぐぐってください。^^;

JBKK
質問者

補足

回答有難うございます。 SJISの正規表現チェックは難しいんですね~。 EUCにコンバートしてやってみようかと思っています。

関連するQ&A

  • 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
  • preg_matchで全角数字のみ許可したいのです

    phpにてメールフォームを使用してます、 最近スパムメールが増えて来たので対処方法を考えました。 お問い合わせの電話番号が現在半角のみ対応してますが、 これを全角の数字のみ通る様にしたいと思います。 現在使用しているのは下記の通りです、 if (!$phone){error("電話番号を入力して下さい");} if ($phone){ if (!preg_match("/^\d{2,5}-?\d{1,4}-?\d{3,4}$/",$phone)) {error("電話番号の入力が不正です"); } } この何処を修正すれば良いのでしょうか? 自分なりに調べましたがお手上げでGive Up状態です。 ご存知の方が居られましたらお知恵をご教授頂ければ助かります。

    • ベストアンサー
    • PHP
  • 全角で囲まれた文字列の抽出をしたい。

    全角で囲まれた文字列の抽出をしたい。 phpコマンド preg_match($pattern,$str,$match)を使い $str = "で検索した結果 1~10件目 / 約14件 - 0.09秒"; を 「約」と「件」で囲まれた「14」という文字列を抽出したいのですが $patternの正規表現がわかりません。 教えてください。

    • ベストアンサー
    • PHP
  • PHPの正規表現「preg_match」で漢字を含む場合のマッチパター

    PHPの正規表現「preg_match」で漢字を含む場合のマッチパターンについて 宜しくお願い致します。 preg_matchを使っての正規表現で、「あいうえおかきくけこ3月10日さしすせそ」という文字列から「3月10日」だけを抽出するには、どういうパターンが良いのでしょうか? 下記の様にやってみましたが、だめでした。。。 preg_match("/\d{1,2}[月]\d{1,2}[日]/",$hoge,$match) これではうまくいきません。 どなたかお助けくださいー!

    • ベストアンサー
    • PHP
  • preg_matchでエラーが出ます。

    「PHP Warning: preg_match() expects parameter 2 to be string, array given in~」というエラーが出てきて困っています。 該当する行は下記です。 if( preg_match("/http:\/\/aa.com\//" , $url ) ) 真ならば上手く行くのですが、違うアドレスだった場合、エラーが出ます。 当方PHP初心者ですが、助言をお願いします。

    • ベストアンサー
    • PHP
  • preg_matchの正規表現がうまくいかない

    たとえば、http://gehasoku.com/?p=2のソースコードには ------------------- <rdf:Description rdf:about="http://www.com/aaa.html" trackback:ping="http://www.com" dc:title="タイトル" dc:identifier="http://iii.com/bbb.html" dc:subject="ハードウェア" dc:description="1 名前:名無しさん " dc:creator="soft_net" dc:date="2012-02-21T20:05:01+09:00" /> ------------------- のような形の<rdf:Description~~~/>タグの情報ががいくつかあると思います。これらすべてを文字列として取得したくて、次のようなphpを作成しましたが、うまく動作しません。 原因はどうやらpreg_match_allの正規表現がうまくいっていないからのようですので、 <rdf:Description~~~/>を抜き出すことができる正規表現を教えてください。 自分でもここでチェックしながらやりましたが、 http://www.rider-n.sakura.ne.jp/regexp/regexp.php <rdf:Description~をマッチすることはできても、/>で閉じることができませんでした。 よろしくお願いします。 <?php $url="http://gehasoku.com/?p=2"; $html=file_get_contents($urls); preg_match_all("/<rdf:Description(.*)?\/>/",$html,$match); print_r($match); foreach($match[1] as $value){ echo $value; } ?>

    • ベストアンサー
    • PHP
  • PHPのpreg系正規表現が正しいかチェックる方法

    お世話になります PHPのpreg系正規表現で入力された値が 正規表現として正しいかどうか調べたいのですが どのようにすれば良いのでしょうか? 「正しい」とは 導き出したい値が正しいかではなく 正規表現の記述方法が正しいかどうかです 「[]」と「{}」が正しく閉じているかチェックするだけでいいのかな?? チェック用の関数などあったら最高です (例) 正しい [0-9]{1,3} 上記をpreg系関数に入れると1~3文字の半角数字という意味になります 誤っている [0-9{1,3} 上記をpreg系関数に入れると、括弧が閉じていないので Compilation failedになります お忙しい中恐縮ですが 分かる方お助け下さいませ

    • ベストアンサー
    • PHP
  • 全角カタカナの正規表現

    if (preg_match('/[ァ-ヶー]+/', $value, $match )) { print ("$value"."はカタカナです。"."($match[0])"."<br />") } else { print ("$value"."はカタカナではない。<br />"); } という感じで全角カタカナにマッチさせる正規表現を使いたいのですが、このやり方だと「全角カタカナを含んでいる…」という表現になってしまいます。ある文字列が「すべて全角カタカナである」という正規表現を考えているのですが、なかなかうまくいきません。逆引きのサンプルなんかでもなかなか見つからなくて困っています。  同様に「すべて平仮名にマッチ!」というのにも応用できると思うのですが、なかなかうまく行きません。  是非、そのやり方やヒントをおしえてください。  マルチバイト対応なので[ぁ-ん]のような形で表記できます。またPerl互換(preg_match)で作っているので、Perlに詳しい方も是非是非おしえてください。

    • ベストアンサー
    • PHP
  • preg_matchの検索について

    <?php  header("content-type: text/plain");  $pat = '/<a href="([^"]*)">/';  $html="<p><a href=\"http://test.net/test3.html\">リンク</a></p>";  preg_match($pat,$html,$match); print_r($match); ?> 上記正規表現プログラムを作成しました。 結果を確認したところ、 Array ( [0] => <a href="http://test.net/test3.html"> [1] => http://test.net/test3.html ) このようにでるのですが、[1]つめが存在している理由がわかりません。 [0]だけが出てくると思っていたのですが、なぜ、[1]はどのような理由で作成されたのでしょうか。 ご教授よろしくお願いします。

    • ベストアンサー
    • PHP
  • preg_match_all関数でaタグの属性を

    PHPのpreg_match_all関数でaタグの属性hrefの値だけをすべて取得するにはどうしたらよいでしょう?? 正規表現の部分が分かりません。 お願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう