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

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

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

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

Q&A

解決済

2回答

2124閲覧

PHPの正規表現について

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

1クリップ

投稿2021/08/26 08:48

前提・実現したいこと

行いたいバリデーションについて、どのように正規表現を書けばいいかわからないので質問させていただきます。

全体の桁数は6桁以内かつ、小数は2桁まで許容

上記をチェックしたいです。
パターンとして、
半角数字1桁〜6桁(1、265、153625など)
半角数字1〜3桁で小数第1(2)位(1.3、5.6など)
半角数字5桁で小数第1位(25632.2など)
半角数字4桁で小数第2位(4658.36など)
上記のようなパターンを許容したいです。

先頭は1以上とし、小数が第3位まであったり、小数含む(含まず)全体で7桁以上あったらエラーとしたいです。

試したこと

思い付くところまでは書いたのですが

/^[1-9][0-9]{0,5}(.[0-9]{0,2})?$/

自分でもこれが正しくないことはわかるのですが、これ以上書き方がわかりませんでした。

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

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

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

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

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

m.ts10806

2021/08/26 08:52

様々な副作用のある正規表現よりも要件ひとつずつ潰すようにしたほうがテストも改修もしやすくなると思うのですが、正規表現は必須ですか?
退会済みユーザー

退会済みユーザー

2021/08/26 09:01

あまり正規表現でやりたくない系の質問ですね^^; +100 とか .11 とかはどう判断します?
退会済みユーザー

退会済みユーザー

2021/08/26 09:04

すみませんPHPの勉強中なので、副作用とかはよくわかっていないです。 テスト、改修などもする予定はありません。 必須ではないですが、正規表現としてどう書けばいいのかが気になって質問させていただきました。
退会済みユーザー

退会済みユーザー

2021/08/26 09:06

あまりよい正規表現ではないなら、正規表現として書かない方がよい?理由などを回答として教えていただけたら嬉しいです。
m.ts10806

2021/08/26 09:55 編集

改修はともかくテストはしないといけないのでは。 「どのケースは通す、通さない」の動作確認しないといけませんよね。 正規表現の採用判断もパターンケース次第なところもあります(幾つか出されてはいますが、既に指摘があるように抜け道があるように思うので)。
退会済みユーザー

退会済みユーザー

2021/08/26 10:07

テストの認識にすれ違いがあるかもしれませんが、書いたコードを動かして試すくらいは行おうと思ってます。 ただ、勉強を始めてそれほど経っていないので、プロの方々が考えているようなレベルでのテストは行えません。 私の質問した内容は、抜け道を全て潰すのが無理、若しくはかなり難しいということでしょうか? どういった点が難しいのかもよく分かっていないので、副作用であったり、あまり正規表現でやりたくないという理由を回答にて教えて頂ければ幸いです。
m.ts10806

2021/08/26 10:10 編集

いえ「テストの予定はない」と仰ったので「じゃあどうやって組んだコードが要件通りなのか確認するのだろう」と疑問に思っていました。 別にプロの目線かどうかは関係なく、あくまで一般的なプログラミングの範疇です。(本気でプロの目が欲しいなら「質問と回答」という形では無理です。対価が発生します)
m.ts10806

2021/08/26 10:11

あくまで確認したいのは「正規表現じゃないとダメなのかどうか」 と「正規表現以外で組んでみたか」 と「質問に提示されているケース以外はどの程度受け入れられるか(考えているか)」 という3点ですね。
退会済みユーザー

退会済みユーザー

2021/08/26 10:26

「正規表現じゃないとダメなのかどうか」 →正規表現以外に何があるのでしょうか? 「正規表現以外で組んでみたか」 →組んでないです。 「質問に提示されているケース以外はどの程度受け入れられるか(考えているか)」 →これがよくわからず逆に質問となってしまい申し訳ないのですが、どのようなケースがあるのでしょうか? 文字としては半角数字、記号?としては小数点としての「.」(先頭には来ない、末尾には付かない)しか想定していませんでした。
m.ts10806

2021/08/26 10:29 編集

「何を許容するか、何をNGとするかもっと詳細のパターンを具体的な値で」なので、これは要件です。他者よりその仕様を考えた人が決めることになります。 ※ te2jiさんが指摘されているのもそのうちの具体的な値の1つです。
退会済みユーザー

退会済みユーザー

2021/08/26 10:52

半角数字0〜9と小数点の「.」のみ許容、それ以外の記号はNG、先頭の数字は1〜9、末尾に「.」は付かない、末尾に0は付かない。 これしか思い付かないので以上でお願いします。
guest

回答2

0

私なら例えばで以下のように1つずつ行います。

  1. 元の値の.を置換で消す

全て数値かチェック
・6桁以内かチェック
0. ↑がOKの場合、元の値を.explode
配列のサイズが2以内かチェック
・配列のサイズが2のときに配列2番目が1~2桁かチェック

あくまで「例えば」なので、やり方はいろいろあると思います。
※これでもどれだけ抜け道をフォローできたか不明ですが、おおよそ満たせているはず


正規表現を出来るなら避けたい理由は下記

  • 抜けパターンが見つかった時に慎重に改修しないとこれまでOKだったパターンにも影響が出る
  • 要件追加などが出たときに上記と同じ理由
  • パッと見たときに何を表現しているのか直感的に理解しづらい
  • 大抵は代替手段がある

投稿2021/08/26 11:04

編集2021/08/26 11:05
m.ts10806

総合スコア80875

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

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

0

ベストアンサー

小数点無しの場合、小数点以下1桁の場合、小数点以下2桁の場合をそれぞれ書いて、| (=または)でつなぐのが簡明でしょう。

投稿2021/08/26 10:41

otn

総合スコア85762

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

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

退会済みユーザー

退会済みユーザー

2021/08/26 11:01

回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問