4 回答

TA貢獻1865條經驗 獲得超7個贊
小數點前的值應小于10位
此模式允許 0 到 9 位數字,然后可選地允許小數點后跟無限位數字。
如果您的要求是小數點前至少有一位數字,則更{0-9}
改為{1,9}
.
如果您的要求是小數點前有零到十位數字,則更{0,9}
改為{0,10}
.
代碼:
$tests = [
? ? '12345678901',
? ? '1234567890',
? ? '123456789',
? ? '1234567890.1',
? ? '1234567.8901',
? ? '1234.5678901',
? ? '1.2345678901',
? ? '.12345678901',
];
foreach ($tests as $test) {
? ? var_export([$test, (bool)preg_match('~^\d{0,9}(?:\.\d+)?$~', $test)]);
? ? echo "\n";
}
輸出:
array (
? 0 => '12345678901',
? 1 => false,
)
array (
? 0 => '1234567890',
? 1 => false,
)
array (
? 0 => '123456789',
? 1 => true,
)
array (
? 0 => '1234567890.1',
? 1 => false,
)
array (
? 0 => '1234567.8901',
? 1 => true,
)
array (
? 0 => '1234.5678901',
? 1 => true,
)
array (
? 0 => '1.2345678901',
? 1 => true,
)
array (
? 0 => '.12345678901',
? 1 => true,
)

TA貢獻1770條經驗 獲得超3個贊
如果總數不應超過 10,并且數字不能以逗號開頭,則可以斷言不是 11 位,并保留匹配\d+
1 位或更多位的數字。
^(?!(?:[^\d\r\n]*\d){11})\d+(?:\.\d+)?$
解釋
^
字符串的開始(?!
Negative lookahead,斷言右邊的不是(?:[^\d\r\n]*\d){11}
匹配任何字符的 11 次,除了換行符后跟一個數字
)
關閉前瞻。\d+
匹配 1 個以上的數字(?:\.\d+)?
可選擇匹配一個點和 1+ 個數字$
字符串結束

TA貢獻1827條經驗 獲得超9個贊
你在陳述兩件事(并沒有展示很多可以使用的例子):
"小數點前的值應小于10位"
“我需要 10 位數字的限制,但小數點后的值沒有限制”
哪一個?我采用了第一個假設,即不能超過 9 位數字,但必須至少有一個。同樣對于數字有效性,我認為只以單個零或根本不從零開始是有意義的:
^(?:0|[1-9]\d{0,8})(?:\.\d+)?$
^
- 開始字符串錨。(?:
- 第一個非捕獲組。0|[1-9]\d{0,8}
- 單個零或1-9 之間的單個數字,后跟零到 8 個數字,以保持在 10 位以下。
)
- 關閉第一個非捕獲組。(?:
- 第二非捕獲組。\.\d+
- 一個文字點后跟一個或多個數字。
)
- 關閉第二個非捕獲組。?
- 使第二個非捕獲組可選。$
- 結束弦錨。
注意:如果您允許數字以點開頭,這可以簡化。

TA貢獻1783條經驗 獲得超4個贊
以下模式適用于 <= 10 位數字到點之前的值和點之后的任意數量的數字。
$b = preg_match("!^\d{1,10}(\.\d*)?$!",109.9);
- 4 回答
- 0 關注
- 380 瀏覽
添加回答
舉報