Php 正则表达式添加10位数的限制,十进制值没有限制

Php 正则表达式添加10位数的限制,十进制值没有限制,php,regex,Php,Regex,我想应用一个验证,在这里我需要一个10位数的值限制,但小数点后的值没有限制 像这样 100000000.2121 小数点前的值应小于10位。 我在试这个正则表达式 ^(10 |\d)(\.\d{1,2})$ 但这样,我只添加限制为2的十进制数字。如何实现这一点?如果总数不应超过10,并且数字不能以逗号开头,则您可以声明不能有11个数字,并保持\d+与1个或多个数字匹配 ^(?!(?:[^\d\r\n]*\d){11})\d+(?:\.\d+)?$ 解释 ^字符串的开头 (?!消极前瞻,断言右

我想应用一个验证,在这里我需要一个10位数的值限制,但小数点后的值没有限制

像这样
100000000.2121
小数点前的值应小于10位。 我在试这个正则表达式
^(10 |\d)(\.\d{1,2})$

但这样,我只添加限制为2的十进制数字。如何实现这一点?

如果总数不应超过10,并且数字不能以逗号开头,则您可以声明不能有11个数字,并保持
\d+
与1个或多个数字匹配

^(?!(?:[^\d\r\n]*\d){11})\d+(?:\.\d+)?$
解释

  • ^
    字符串的开头
  • (?!
    消极前瞻,断言右边的不是
    • (?:[^\d\r\n]*\d){11}
      匹配任何字符的11倍,除了后跟数字的换行符
  • 关闭前瞻
  • \d+
    匹配1+个数字
  • (?:\。\d+)
    可以选择匹配一个点和1+个数字
  • $
    字符串结尾

以下模式适用于您正在陈述两件事(并且没有显示大量示例):

  • “小数点前的值应小于10位”
  • “我需要限制值为10位,但小数点后的值没有限制”
是哪一个?我采用了第一个假设,即数字不能超过9位,但必须至少有一位。此外,对于数字有效性,我认为只从一个零或非开始是有意义的:

^(?:0|[1-9]\d{0,8})(?:\.\d+)?$


  • ^
    -开始字符串ancor
  • (?:
    -第一个非捕获组。
    • 0 |[1-9]\d{0,8}
      -一个0介于1-9之间的一个数字,然后再加上0到8个数字,使总数保持在10位以下
  • -关闭第一个非捕获组
  • (?:
    -第二个非捕获组。
    • \。\d+
      -后跟一个或多个数字的文字点
  • -关闭第二个非捕获组
  • -将第二个非捕获组设置为可选
  • $
    -结束字符串ancor

注意:如果允许数字以点开头,则可以简化此操作

小数点前的值应小于10位

此模式允许0到9位数字,然后可选地允许小数点后跟无限位数

如果要求小数点前至少有一位数字,则将
{0-9}
更改为
{1,9}

如果要求小数点前有0到10位数字,则将
{0,9}
更改为
{0,10}

代码:()

输出:

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,
)

你试过把它改成
d{1,10}
?JayBlanchard是的,我试过了,但是如果有人在一个小数点后加上超过10个数字呢?这将再次抛出验证。如果(v<9E9)会,则这是一个数字suffice@Naina请提供一组值以及您对每个值的期望评估。您已收到4个答案——所有这些答案对您的需求有不同的解释。这是一个不清楚的问题。请解释一下好吗?您的模式匹配一个11位整数。这违反了所需的逻辑。现在您的答案几乎就是我的答案,除了小数点前允许有10位数字,它将匹配
0。
required | numeric | regex:^(?)(?:[^\d\r\n]*\d){11})\d+(?:\.\d+)$”
给出一个错误,说preg\u match():未知修饰符“\\”您能检查一下@thefthbird吗?不是我的dvbtw@mickmackusa我认为OP需要总共匹配10位数字,包括小数部分,因为这行
像这样100000000.2121小数点之前的值应该小于10位。
即使这是需要的规则,您的回答错误地评估了我上面评论的模式演示中的几个输入。也许我们应该投票决定是否关闭。OP似乎已经消失了。@JvdV我的假设是总数不应该超过10位。如果不是这样,那么我的答案是错的。根据问题的逻辑,你的答案是不对的。阅读此内容(我想应用一个验证,其中我需要限制值为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,
)