有多种方法可以将字符串转换为整数。
$someString = substr($input, strripos($input, "_") + 1);
$i = $someString + 0;
$i = (int) $someString;
$i = intval($someString);
$someString
来自使用输入,因此可能需要考虑。哪个选项“更好”或具有最负面的副作用? (即表现方面,安全方面)
$input
可能看起来像1_abcd_1
或1_abcd_2
。这是非常固定的 - 除了在这个例子中组成的 abcd 。此输入来自单选按钮,但用户可以随时更改其数据。因此,我必须考虑恶意数据。
答案 0 :(得分:3)
我更喜欢类型转换,$i = (int) $someString;
这很清楚。
答案 1 :(得分:2)
由于输入被转换为数字,因此没有安全问题。性能差异可以忽略不计。但是,在某些情况下,第一个可能不会产生整数。
例如,让$input = '19.99';
。
$i = $someString + 0; // $i = 19.99
其他两种情况相同,但$i = (int) $someString;
平均值比$i = intval($someString);
快约56%。由于两者都在几毫秒内执行,因此性能差异通常可以忽略不计,除非它们出现在相当大的循环中。
$i = (int) $someString; // $i = 9
$i = intval($someString); // $i = 9
关于安全问题:如果您希望$input
始终采用特定形式(例如 #_ xxxx _#),那么您应该验证它的是。扩展Jack的注释 - 如果你使用PHP> = 5.2.0,你可以使用正则表达式检查输入的格式。
<?php
$input = '1_abcd_1';
// Set the desired format
$filter_options = array(
'options' => array(
// choose a regular expression that matches your format
'regexp' => '/^[\d]_[a-z]{4}_[\d]$/'
)
);
$format = filter_var($input, FILTER_VALIDATE_REGEXP, $filter_options);
if ($format !== false) {
// process input
$someString = substr($format, strripos($format, "_") + 1);
$i = (int) $someString;
echo '$i = ', $i;
} else {
// Handle invalid format
echo 'Malformed data. Potentially malicious';
}
?>
这将完全拒绝以下内容:
0xfe
bob
j_xtyz_5
1_wxyz_22
21_abcd_1
1_Abcd_2
当然,您可以根据需要调整正则表达式。
另见:
如果您不使用PHP&gt; = 5.2.0,则可以使用preg_match。
<?php
$input = '1_abcd_2';
$valid = preg_match('/^[\d]_[a-z]{4}_[\d]$/', $input);
if ($valid) {
// process input
$someString = substr($input, strripos($input, "_") + 1);
$i = (int) $someString;
echo '$i = ', $i;
} else {
// Handle invalid format
echo 'Malformed data. Potentially malicious';
}
?>
验证输入的格式,如果数据被篡改,您可以立即知道。然后你可以采取相应的行动。
答案 2 :(得分:1)
如果你想确定$ someString只是数字,你可以使用
if(is_numeric($someString)){
// proceed your code if $someString is numeric
}else{
// proceed your code if $someString is not numeric
}