PHP:将字符串转换为整数而不删除前导零

4

我有一个包含chmod所使用的文件模式的输入字段。

如果我直接使用它,它会被当做字符串使用,导致失败。如果我将其转换为整数(intval()),它会删除前导零(0777 => 777),再次失败。如果我像这样使用它:

$int = intval($input);
$finished = 0 . $int;

这也失败了,因为is_int($finished)是错误的。我该怎么解决?
5个回答

6

对于整数而言,首位零是不存在的概念,因为它们在数学上没有意义。在十进制中,整数0777 等价于 777

但是,如果您尝试将八进制表示法中的"0777" 转换为其整数对应项(十进制下的511)以便与chmod()一起使用,您可以使用octdec($input)。该函数接受一个字符串并输出一个整数,完全按照其名称所述执行操作。

当然,在使用正则表达式执行验证之前,请确保进行验证。您不希望向chmod()传递全局或无效标志,并可能将敏感文件和文件夹暴露给公众。


这个答案是正确的。然而,如果你只是为了验证输入,正则表达式可能更有用,因为它实际上能够检测到无效数据,而不仅仅是将无效数据转换为某个“任意”的整数。 - Matthew
@Matthew:也可以进行清理操作:https://dev59.com/9V3Ua4cB1Zd3GeqP8gIo#8049466 - hakre

2
您正在使用输入字段来获取$input,这意味着该值是一个字符串。
您正在查找该值中的一个八进制数。但是intval不会将字符串作为八进制数处理。 chmod期望$mode参数是一个整数值。
要转换包含八进制数的字符串,可以使用octdec函数:
$int = octdec($value); # '0777' -> 511

因此,您可能希望验证输入并检查它是否符合八进制数的条件,例如通过再次使用decoct进行转换并测试其结果是否相同:

$valid = "0".decoct($int) === $value;

1

尝试使用 preg_match() 检查输入。请参考以下代码。

if(preg_match("/[^0-9.]/", $input)) 
{
    return false;
}
else
{
  -- Some Code Here --
} 

谢谢。


1

没有什么需要解决的,整数类型不能以0开头,除非它等于0。0777按值等于777,通常将权限设置为777没有问题,系统会知道将其视为0777。

如果你必须传递一个前导零,它必须是一个字符串(例如'0'.$finished

Shai。


0

当您使用函数0.$int时,PHP会将其理解为添加两个字符串的操作。因此,结果$finished将是一个字符串。尝试使用函数number_format来解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接