質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.36%

PHP preg_match 全角半角の数字のみ

受付中

回答 6

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 6,619

marimokomokmOk

score 52

PHP、preg_matchでわからないとこがあります。
全角半角の数字のみマッチさせたいので、
preg_match('/^[0-90-9]$/', $word)){
としたらできず、
preg_match('/^.*[0-90-9]$/', $word)
としたらできました。
なぜでしょう??
.*はなんでしょうか?

<?php require 'header.php';?>
<form action="word-output.php" method="post">
<input type="text" name="word">
<input type="submit" value="確定">
</form>
<?php require 'footer.php';?>
<?php require 'header.php';?>
<?php
$word = $_POST['word'];
// if(preg_match('/^[0-90-9]$/', $word)){
    if(preg_match('/^.*[0-90-9]$/', $word)){
    echo 'ok';
}else{
    echo 'NG';
}
?>
<?php require 'footer.php';?>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2017/05/09 12:39

    「大文字小文字」ではなく「全角半角」では?

    キャンセル

  • marimokomokmOk

    2017/05/09 13:32

    修正しました。ありがとうございます。

    キャンセル

回答 6

+6

いくつも問題があります(他の人が指摘していない部分に絞りました)。

  • 全角文字をpreg_xxxで処理したい場合、正規表現をUTF-8モードにする必要があります。/.../uと、最後にuを入れましょう。
  • 文字クラス内の全角ハイフンはただの文字です。0-9ではなく、0-9とする必要があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/09 14:11

    .*の意味がわかりません。。

    キャンセル

  • 2017/05/09 14:34

    >/.../uと、最後にuを入れましょう。

    キャンセル

  • 2017/05/09 14:39

    preg_match('/^.*[0-90-9]$/u', $word)
    ですね><
    あ1など数字以外の文字が混ざってしまいます(。*゜;ё;゜*)

    キャンセル

+4

.は任意の1文字
*は0回以上の繰り返し
ですが。
正規表現の表記法の説明に、これらはちゃんと書いてあります。
http://php.net/manual/ja/reference.pcre.pattern.syntax.php
逐一質問していたらいつまでも自分で学ぶことが出来ないエンジニアに育ってしまいますので、自分で出来るところまでは調べてみるクセを付けた方が良いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/09 13:37

    ありがとうございます^^
    めんどくさがり、だるさでついteratailに気軽に質問してしまいました
    悪いクセを直します><。。

    キャンセル

  • この投稿は削除されました

+4

大文字小文字の数字のみマッチさせたいので、

そもそも倍角の数字を大文字とはいいわないですよね?

'/^[0-90-9]$/'

は、先頭から末尾までの間に数字が1つだけ出現するという意味で

'/^.*[0-90-9]$/'

ですと、(数字を含む)なにか適当な文字ではじまって末尾の文字が数字
という意味になります。そういう意味では「'/[0-90-9]$/'」と同意で
命題とは異なります。

せめてこうして下さい

'/^[0-90-9]+$/' → '/^[0-90-9]+$/'


※ハイフン修正しました

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/09 13:35

    ありがとうございます!
    ハイフンは必ず半角なんですね!^^

    キャンセル

  • 2017/05/09 13:37

    ハイフンが全角だと
    [0ー9]→「0」か「-」か「9」という意味になります

    キャンセル

+4

https://3v4l.org/b7skh

<?php

function chk($word) {
    echo PHP_EOL . 'Word: ' . $word . PHP_EOL;
    echo 'pattern: 1.' . PHP_EOL;
    if (preg_match('/^.*[0-90-9]$/u', $word)) {
        echo 'Ok.' . PHP_EOL;
    }
    else {
        echo 'Ng.' . PHP_EOL;
    };
    echo 'pattern: 2.' . PHP_EOL;
    if (preg_match('/^[0-90-9]+$/u', $word)) {
        echo 'Ok.' . PHP_EOL;
    }
    else {
        echo 'Ng.' . PHP_EOL;
    };
}

chk('abc12345');
chk('abc12345');
chk('12345');
chk('12345');
chk('1122334455');


実行結果
こんな正規表現で大丈夫か?


半角数字のみということであれば。
https://3v4l.org/8C3lC

<?php

function chk($word) {
    echo PHP_EOL . 'Word: ' . $word . ' - ';
    if (preg_match('/^[0-9]+$/u', $word)) {
        echo 'Ok.' . PHP_EOL;
    }
    else {
        echo 'Ng.' . PHP_EOL;
    };
}

chk('abc12345');
chk('abc12345');
chk('12345abc');
chk('12345abc');
chk('12345');
chk('12345');
chk('1122334455');
chk('12.345');


結果:
実行結果

正規表現パターンは追々学習していけばよいかと。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/09 13:53

    全角半角の数字が混ざっていても良いのかどうかは、仕様から読み取れないので全く考慮しなかった。

    キャンセル

  • 2017/05/09 14:24

    ご解答下さりありがとうございます
    高度ですね
    よくみて考えてみます。。(;°;ё;°;)

    キャンセル

  • 2017/05/09 14:33

    あ1など数字以外の文字が混ざらない文字列にマッチしたいです

    キャンセル

  • 2017/05/09 15:40

    ちゃんとテストパターンまで考えて、テストするロジックを考えて自分でやってみる癖をつけると良いですよ。

    キャンセル

+3

全角半角の数字のみだけで成り立っているか?という判断をしたいなら、
/^[0-90-9]+$/ じゃないですかね?

$wordに文字がない時も許可するなら/^[0-90-9]*$/ ですね?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/09 13:40 編集

    ハイフン修正しました。。。
    コピって貼ったので気づきませんでした。失礼しました。

    キャンセル

  • 2017/05/09 14:14

    これだとあ1でもマッチしてしまいます。。

    キャンセル

  • 2017/05/09 14:47

    .* をつけてるから、「あ1」とマッチするんです。
    . と * の説明は、kunaiさんがしてくれていますね。
    preg_match('/^[0-90-9]+$/u', $word)

    キャンセル

0

スラッシュは範囲、キャレットは文頭、ドルは文末、カギカッコ内は連番。

しか覚えてないですがチェックツールがwebサービスで合った気がします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る