Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 什么正则表达式模式才是允许双类型的正确模式?_Php_Regex_Zend Framework_Zend Form_Zend Validate - Fatal编程技术网

Php 什么正则表达式模式才是允许双类型的正确模式?

Php 什么正则表达式模式才是允许双类型的正确模式?,php,regex,zend-framework,zend-form,zend-validate,Php,Regex,Zend Framework,Zend Form,Zend Validate,我使用zend framework编写了以下代码: $descuentoElement->addValidator(new Zend_Validate_Regex(array('pattern' => '/[0-9]+(.[0-9]+)?/'))); 我想验证双类型输入,如1.2或4…不是“4sd”,而是此模式不起作用…它允许写入“4s”…是否有任何答案或正确的正则表达式模式…我想要一个建议…谢谢…您必须锚定您的正则表达式并避开此点: ^[0-9]+(\.[0-9]+)?$ 锚(

我使用zend framework编写了以下代码:

$descuentoElement->addValidator(new Zend_Validate_Regex(array('pattern' => '/[0-9]+(.[0-9]+)?/')));

我想验证双类型输入,如1.2或4…不是“4sd”,而是此模式不起作用…它允许写入“4s”…是否有任何答案或正确的正则表达式模式…我想要一个建议…谢谢…

您必须锚定您的正则表达式并避开此点:

^[0-9]+(\.[0-9]+)?$
锚(
^
$
)是必需的,因此它匹配完整的字符串,而不仅仅是任意的子字符串。点是正则表达式中的一个特殊字符,通常与所有其他字符匹配。

这就是您需要的:

^\d+(\.\d+)?$
^
:仅从字符串开头开始匹配

$
:仅当regexp与字符串结尾匹配时才匹配

:圆点需要从零开始转义。它将匹配任何字符


\d
:匹配任何数字[0-9]

@Joey的答案在匹配整行的情况下有效,但您需要使用

/[^0-9][0-9]+(\.[0-9]+)?[^0-9]/
如果你的目标不总是在一条线上

细分:

/
正则表达式分隔符
[^0-9]
非数字
[0-9]+
一个或多个数字
开始可选匹配
\.
点字符,用
\

[0-9]+
一个或多个数字
)?
结束可选匹配;通过

使其成为可选的
[^0-9]
非数字
/
正则表达式分隔符

为什么不直接使用

Zend_Validate_Float允许您验证给定值是否包含浮点值。此验证器还验证本地化输入

参考指南中的示例:

$validator = new Zend_Validate_Float();
$validator->isValid(1234.5);   // returns true
$validator->isValid('10a01'); // returns false
$validator->isValid('1,234.5'); // returns true

如果您仍然想要一个正则表达式,则建议将此正则表达式用于double:

{
    ^ (?&osg)\ * ( (?&int)(?&dec)? | (?&dec) ) (?: [eE](?&osg)(?&int) )? $
    (?(DEFINE)
        (?<osg>[-+]?) # optional sign
        (?<int>\d++) # integer
        (?<dec>\.(?&int)) # decimal fraction
    )
}x
{
^(?&osg)\*(?&int)(?&dec)|(?&dec))(?:[eE](?&osg)(?&int))$
(?(定义)
(?[-+]?)#可选符号
(?\d++)#整数
(?\.(?&int))#小数
)
}x

这可以缩短为/^\d\d+(\.\d+)^\d/,但这可能有点不可读。请您回顾一下给出的答案,并接受对您最有帮助的答案,或者指出为什么这些答案都不能解决您的问题。谢谢