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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

4回答

2780閲覧

PHPにて、パラメータの値が正の整数であるかを正規表現でチェックしたい

minyouyuu

総合スコア39

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2019/07/26 11:05

PHP

1if(preg_match("/[0-9]*/", $_GET['p'])) { 2 処理 3}

PHPで、パラメータpの値が正の整数であるかを、正規表現で確かめたいのですが、上記コードで合ってますでしょうか?

もう一つ質問なのですが、phpでの正規表現を調べると、preg_match("/[0-9]*/", $_GET['p'])のように、preg_matchの第1引数の""内にスラッシュが二つ含まれているのを見かけるのですが、これはphpでの仕様でしょうか?それとも、正規表現の仕様でしょうか?正規表現で調べてもスラッシュが出てこないので、phpでpreg_matchを使う際は、スラッシュで囲むのが決まりなのかなと思うのですが、合ってますでしょうか?

お手数をお掛けしますが、ご教授のほど、よろしくお願いいたします。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/07/26 11:34

正規表現でないといけないんでしょうか?
m.ts10806

2019/07/26 11:37 編集

>スラッシュが二つ含まれているのを見かけるのですが 「デリミタ」で調べてください
minyouyuu

2019/07/26 12:02

確かに、正規表現ではなくてもかまいません。パラメータが正の整数であるかを確かめるのが目的なので。正規表現以外の方法も考えてみます!
guest

回答4

0

ベストアンサー

preg_match("/[0-9]*/", $_GET['p'])

  • GETに必ず'p'という要素があるとは限らない
  • /[0-9]*/は正の整数ではない

正の整数は0を含まないので「/[1-9][0-9]*/」です。

スラッシュで囲むのが決まりなのかな

正規表現の慣例でスラッシュで囲っていますが
これはデリミタといってphpの正規表現の場合、特殊文字以外の
適当な文字で囲えば機能します
状況が許せば「@hoge@」とかで良いわけです

ちなみにgetで受けたデータが正の整数かどうかチェックするならこう

PHP

1<?PHP 2$p=filter_input(INPUT_GET,"p",FILTER_VALIDATE_INT,["options"=>["min_range"=>1]]); 3if($p){ 4 var_dump($p); 5} 6?> 7<form> 8<input type="submit" name="p" value="-1"> 9<input type="submit" name="p" value="0"> 10<input type="submit" name="p" value="1"> 11<input type="submit" name="p" value="100"> 12<input type="submit" name="p" value="文字"> 13</form>

投稿2019/07/26 11:34

編集2019/07/26 11:37
yambejp

総合スコア114771

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minyouyuu

2019/07/26 13:02

ご回答、ありがとうございます。filter_inputは知らなかったのですが、調べてみるとパラメータ判定にとても便利なものだということが分かりました。この方法で実装しようと思います。
guest

0

"/\A[1-9][0-9]*\z/"と、文字列先頭と末尾のアンカーを付けないと、「正の整数」じゃなくて「正の整数が一部にでも含まれた文字列」を判定していることになります。"abc1"とか。

投稿2019/07/26 12:32

otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minyouyuu

2019/07/26 13:03

ありがとうございます。アンカーというものは知らなかったです。勉強してみます!
guest

0

上記コードで合ってますでしょうか?

合ってません。*は「0回以上の繰り返し」なので、「」(空文字列)でもtrueになってしまいます。

ちなみに
/[1-9][0-9]*/
でもダメだと思います。例えば、「a5b」はtrueになります。

/^[1-9][0-9]*$/ じゃないですかねぇ……

投稿2019/07/26 12:32

takepan1973

総合スコア821

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minyouyuu

2019/07/26 13:07

ありがとうございます!"/[0-9]*/"これで、数値のみを受け付けるようにできると思っていたのですが、違うのですね。「^」や「$」について勉強してみます!
guest

0

PHPで、パラメータpの値が正の整数であるかを、正規表現で確かめたいのですが、上記コードで合ってますでしょうか?

この表記だと、「空文字列」や「0」、「007のような、ゼロ始まりの整数と言いづらいもの」まで含まれてしまいます。/[1-9][0-9]*/とするのが確実です。

phpでpreg_matchを使う際は、スラッシュで囲むのが決まりなのかなと思うのですが、合ってますでしょうか?

はい、preg_***系の関数を使う場合には、両側に同じ区切り文字が必要です(スラッシュでなくても大丈夫です)。

投稿2019/07/26 11:36

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minyouyuu

2019/07/26 13:05

ご回答、ありがとうございます。preg_***系の関数を使う場合には、区切り文字が必要なのですね!調べてみたら、確かにスラッシュでなくてもいいようでした。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問