[PHP]正規表現で整数かどうかを調べる

Read More



以前の記事で整数と小数を調べる関数を書いた。
■[PHP]数値、整数値、小数の値かをチェックする
http://xirasaya.com/?m=detail&hid=523


今回は基本に戻りpreg_match()やpreg_replace()などで使える正規表現を書いてみる。

書いた正規表現は以下の通り。
・整数のみ許可する正規表現
・小数のみ許可する正規表現
・整数と小数の両方を許可する正規表現

※いずれも負数を許可している




--
■正規表現で整数のみ許可
<?php
$tar = 1;
// OK1: 0
// OK2: 1, 10, 11, 100, 101, 111 and negative number
$chk = preg_match('/^(0|-?[1-9][0-9]*|)$/u', $tar, $match);
?>

'|'(パイプ)で複数の条件を指定している。
'-0' や'001' などといったものはNGとなる。




--
■正規表現で小数のみ許可
<?php
$tar = 0.1;
// OK1: 0
// OK2: 0.1, 0.11, 0.10, and negative number
// OK3: 0.01, 0.011, 0.010 and negative number
// OK4: 1.0, 1.1, 11.0, 11.1, 11.10, 11.01, 11.010 and negative number
// OK5: 0.0, 0.00, 0.000
$chk = preg_match('/^(0|-?0\.[1-9][0-9]*|-?0\.[0-9]+[1-9][0-9]*|-?[1-9][0-9]*\.[0-9]+|0\.[0]+)$/u', $tar, $match);
?>

NGとなるのは'-0.0' や'-0.00'、'00.0'など。
OK5で許可している0.0や0.00などは小数として通してよいか意見が分かれる所だと思う。
許せない人は、パイプで区切った最後の正規表現を消せばいい。

まあそれを言ったら1.0とかもどーなのって話になりそうなんだけど。
とりあえず今回はどちらも許可してみた。




--
■正規表現で整数と小数のみ許可
<?php
$tar = 0.1;
$chk = preg_match('/^(0|-?[1-9][0-9]*|-?0\.[1-9][0-9]*|-?0\.[0-9]+[1-9][0-9]*|-?[1-9][0-9]*\.[0-9]+|0\.[0]+)$/u', $tar, $match);
?>

先述した2つをMixした形の正規表現になっている。
挙動としては整数も小数も負数も許可している。
ここでの注意点はやはり0.0や1.0の形も許可しているという点。




たぶんどの正規表現も動くと思う。
が、おかしいところがあったら指摘してくれたらうれしい。




--
おまけ

自分は、正規表現を1行で書くことに大きな意味はないと思っている。
むしろ可読性が落ちるので、長く複雑な正規表現になるくらいなら素直に複数行に分けて書いた方がよいと考える。

だが世の中には正規表現を1行で書くことに異常なこだわりをみせ、またそれを良しとする人もいる。
また状況によっては1行にした方がよい場合もある。


今回の場合は割とありがちなものなので1行でもよいと思われるパターン。



-- 2016/11/02 追記
正規表現を可視化することができるサイト。
なかなかに面白いのでリンクを残しておく。
■正規表現を可視化する
https://regexper.com/


-- 2016/11/02 一部修正
小数を通す正規表現で0.001のパターンが通らなかったのでそこを修正