gpt4 book ai didi

php - 检查值是否仅包含数字、正则表达式或否?

转载 作者:可可西里 更新时间:2023-11-01 13:21:23 24 4
gpt4 key购买 nike

我有一个在我的代码中使用的函数。该函数期望传递的参数是正整数。由于 PHP 是松散类型的,因此数据类型并不重要。但重要的是它只包含数字。目前,我正在使用正则表达式在继续之前检查值。

这是我的代码的简化版本:

function do_something($company_id) {
if (preg_match('/\D/', $company_id)) exit('Invalid parameter');
//do several things that expect $company_id to be an integer
}

我有 Perl 背景,并且倾向于经常使用正则表达式。但是,我知道它们的用法存在争议。

我考虑过使用 intval()(int)强制 $company_id 为整数。但是,我最终可能会得到一些意想不到的值,我希望它快速失败

另一种选择是:

if (!ctype_digit((string) $company_id)) exit('Invalid parameter');

这个场景是正则表达式的有效使用吗?一种方式优于另一种方式吗?如果是这样,为什么?有没有我没有考虑到的问题?

最佳答案

目标

最初的问题是关于验证未知数据类型的值并丢弃除包含仅包含数字 的值之外的所有值。似乎只有两种方法可以达到这个预期的结果。

如果目标是快速失败,人们会希望检查无效值然后失败,而不是检查有效值并将所有代码包装在 if 中。 block 。

问题选项 1

if (preg_match('/\D/', $company_id)) exit('Invalid parameter');

使用 regex如果匹配非数字则失败。缺点:正则表达式引擎有开销

问题的选项 2

if (!ctype_digit((string) $company_id)) exit('Invalid parameter');

使用 ctype_digit如果为假则失败。缺点:必须将值转换为字符串,这是一个(小的)额外步骤

您必须将值转换为字符串,因为 ctype_digit需要一个字符串,PHP 不会为您将参数转换为字符串。如果将整数传递给 ctype_digit ,你会得到意想不到的结果。

这是记录在案的行为。例如:

ctype_digit('42'); // true
ctype_digit(42); // false (ASCII 42 is the * character)

选项 1 和 2 的区别

由于正则表达式引擎的开销,选项二可能是最佳选项。但是,担心这两个选项之间的差异可能属于过早的优化类别。

注意:上述两个选项之间也存在功能差异。第一个选项考虑 NULL和空字符串作为有效值,第二个选项没有(从 PHP 5.1.0 开始)。这可能会使一种方法比另一种方法更可取。制作regex选项功能同ctype_digit版本,请改用它。

if (!preg_match('/^\d+$/', $company_id)) exit('Invalid parameter');

注意: '字符串开始' ^和“字符串结尾”$ anchor 在上面 regex非常重要。否则,abc123def将被视为有效。

其他选项

这里和其他问题中建议的其他方法不会实现既定目标,但我认为提及它们并解释为什么它们不起作用很重要可能会帮助其他人。

  • is_numeric允许指数部分、 float 和十六进制值

  • is_int如果 '1',则检查数据类型而不是对验证无用的值被认为是有效的。表单输入始终是一个字符串。如果不确定值的来源,则无法确定数据类型。

  • filter_varFILTER_VALIDATE_INT允许负整数和值,例如 1.0 .这似乎是实际验证整数而不考虑数据类型的最佳函数。但如果您想要 数字,则不起作用。 注意:检查FALSE很重要identity 而不仅仅是 truthy/falsey if 0被视为有效值。

关于php - 检查值是否仅包含数字、正则表达式或否?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13779209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com