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 关注
- 289 浏览
添加回答
举报