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

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

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

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

Q&A

3回答

1183閲覧

preg_matchで検索し、マイナス、小数点含んでたらエラーを出す方法。

Mason

総合スコア14

PHP

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

0グッド

0クリップ

投稿2021/10/16 06:57

前提・実現したいこと

現在、PHPで問題を解いています。
干支を返す関数を作る問題なのですが、マイナスやピリオドが含まれているときはエラーを出したいです。
本来は、西暦としてありえないマイナスや小数点が含まれていた際にエラーを出したいのですが、
現状はマイナス、小数点だけでなく西暦として成り立つ数字で入力してもエラーになってしまいます。

ご教授していただければ幸いです。

PHP

1<?php 2function toEtoString(int $seireki): string 3{ 4 try { 5 $list12 = array("申", "酉", "戌", "亥", "子", "丑", "寅", "卯", "辰", "巳", "午", "未"); 6 7 $num12 = $seireki - floor($seireki / 12) * 12; 8 9 $zyunishi = $list12[$num12]; 10 $search = '/-|./'; 11 if(preg_match($search, $seireki)){ 12 throw new Exception(''); 13 } 14 return (string)$zyunishi; 15 16 } catch (Exception $e) { 17 return 'error'; 18 } 19} 20print_r(toEtoString(2000)); 21?>

試したこと

preg_matchの部分で-(マイナス)、.(ピリオド)をそのまま一つで指定すればerrorと出る様になり、西暦として成り立つ数字でも干支をちゃんと返します。

if(preg_match('/-/', $seireki)) or if(preg_match('/./', $seireki))

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答3

0

正規表現における.は任意の1文字を指すため、.そのものを検索したい場合はエスケープする必要があります。

php

1if(preg_match('/-|./', $seireki))

ただ、関数の引数がint $seirekiとなっているためにキャストされるので、ピリオドが$seirekiに渡ることはないでしょう。
渡された上でエラー判定したいのであれば引数の型をmixedなどにする必要があります。

投稿2021/10/17 05:56

Eggpan

総合スコア2810

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

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

0

以下の通りで、preg_matchを使わない方針はどうでしょうか。

// マイナスはエラー吐く if ($seireki < 0) { throw new Exception(''); } // 小数点あればエラー吐く if (is_int($seireki)) { throw new Exception(''); }

投稿2021/10/16 07:17

Pomu3270

総合スコア280

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

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

itagagaki

2021/10/16 07:27

確かに。 ただ、is_intではなく ! is_int ですね。 でも $seireki は int なのだから is_int は必ず true かな。
guest

0

あり得ない文字にマッチするかどうかを調べるのではなくて、数値として成り立つ数字にマッチするかどうかを調べれば良いのでは?

/^[1-9][0-9]*$/

1~9999までなら

/^[1-9][0-9]{0,3}$/

投稿2021/10/16 07:16

itagagaki

総合スコア8402

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

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

Mason

2021/10/16 07:30

そちらの方法でも試してみたのですが、マイナスを含んだ際にも干支が表示されるようになってしまいます。 なので、2000では干支が返ってきて、-2000や2.000ではerrorと表示される様にしたいです。
itagagaki

2021/10/16 07:31

回答に書いた正規表現では数字の連続にしかマッチしないので、それは何かが間違っています。
itagagaki

2021/10/16 07:32

^ と $ を付けていなかったとか
Mason

2021/10/16 07:46

再度、確認して見ましたが小数点(ピリオド)の際はerror出るのですが、-2000(マイナス)の際は干支が返ってきてしまいます。 連続した数字でも最初にマイナスから始まるのはスルーされるのかなと感じました。
itagagaki

2021/10/16 08:21

echo preg_match("/^[1-9][0-9]*$/", "2000"), "\n"; echo preg_match("/^[1-9][0-9]*$/", "-2000"), "\n"; を試してみてください。 それと $seireki は toEtoString(int $seireki) として宣言されているので、 たとえ toEtoString(2000.5) と呼び出しても $seireki は 2000 となり、小数点は含まないはずなのですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問