核心數字驗證模式
| 類型 | 正則模式 | 說明 | 匹配示例 |
| 正整數 | ^[1-9]\d*$ | 非零開頭 | 1, 123 |
| 負整數 | ^-[1-9]\d*$ | | -1, -123 |
| 整數(含0) | ^-?([1-9]\d*|0)$ | | 0, -10, 100 |
| 非負整數 | ^\d+$ | 0 和正整數 | 0, 123 |
| 非正整數 | ^(-?\d+)?$ 或 ^((-\d+)|0)$ | 0 和負整數 | 0, -123 |
| 正浮點數 | ^(([1-9]\d*\.\d*|0\.\d*[1-9]\d*)|[1-9]\d*)$ | 含小數點,值>0 | 1.23, 0.5, 10 |
| 負浮點數 | ^(-(([1-9]\d*\.\d*|0\.\d*[1-9]\d*)|[1-9]\d*))$ | 值<0 | -1.23, -0.5 |
| 浮點數(含0) | ^-?(\d+\.\d+|\d+)$ | 簡化版 | 0, 1.5, -2.0 |
| 非負浮點數 | ^\d+(\.\d+)?$ | | 0, 10, 3.14 |
| 非正浮點數 | ^((-\d+(\.\d+)?)|0)$ | | 0, -10, -3.14 |
長度與小數位限制
| 需求 | 正則 | 示例 |
| n 位數字 | ^\d{n}$ | ^\d{6}$ 匹配 123456 |
| 至少 n 位 | ^\d{n,}$ | ^\d{3,}$ 匹配 123, 1234 |
| m-n 位 | ^\d{m,n}$ | ^\d{3,6}$ |
| 兩位小數正實數 | ^\d+(\.\d{2})?$ | 10.00, 5 |
| 1-3 位小數 | ^\d+(\.\d{1,3})?$ | 10.1, 5.123 |
| 金額格式(分隔符) | ^\d{1,3}(,\d{3})*(\.\d{2})?$ | 1,000.00 |
PHP 實戰驗證函數
<?php
function validateNumber($value, string $type = 'float', array $options = []): bool {
$patterns = [
'int' => '^-?\d+$',
'uint' => '^\d+$',
'float' => '^-?\d+(\.\d+)?$',
'ufloat' => '^\d+(\.\d+)?$',
'positive' => '^[1-9]\d*$',
'negative' => '^-[1-9]\d*$',
];
$pattern = $patterns[$type] ?? $type; // 允許傳入自定義正則
// 附加長度限制
if (isset($options['min'])) {
$pattern = "(?=.{$options['min']},)" . $pattern;
}
if (isset($options['max'])) {
// 需結合 lookahead 處理,此處略
}
return (bool)preg_match("/$pattern/", $value);
}
// 使用
var_dump(validateNumber('123', 'uint')); // true
var_dump(validateNumber('-10.5', 'float')); // true
var_dump(validateNumber('0.00', 'ufloat')); // true
var_dump(validateNumber('abc', 'int')); // false
?>
前端輸入限制(HTML5 + JS)
<!-- 僅允許數字和小數點 -->
<input type="text"
inputmode="decimal"
pattern="\d+(\.\d+)?"
oninput="value=value.replace(/[^\d.]/g,'').replace(/\.{2,}/g,'.')"
placeholder="請輸入數字">
避坑提醒
^$ 空字符串會匹配 ^\d*$,用 ^\d+$ 要求至少一位。
- 浮點數
. 需轉義 \.,否則匹配任意字符。
- 大數字超出 PHP 整數範圍(64位約 9e18)時,正則仍通過但轉換為 float 會失精度,需用
bcmath 或 gmp。
- 千分位分隔符、科學計數法、貨幣符號等複雜格式,建議用專用庫(如
moneyphp/money)。
總結
根據業務場景選擇嚴格程度:整數用 ^\d+$ 系、浮點數用 ^\d+(\.\d+)?$ 系、金額嚴格限制小數位。PHP 端驗證不可缺失,前端僅為體驗增強。