由於輸入被強制轉換爲一個數字,有’沒什麼安全問題。性能差異可以忽略不計。但是,在某些情況下,第一個可能不會生成整數。
例如,讓$input = '19.99';
。
$i = $someString + 0; // $i = 19.99
其他兩種情況是等價的,但比$i = intval($someString);
更快$i = (int) $someString;
平均約56%。由於兩者都在毫秒級內執行,因此性能差異通常可忽略不計,除非它們發生在相當大的循環中。
$i = (int) $someString; // $i = 9
$i = intval($someString); // $i = 9
在安全事項:如果你希望$input
總是在一個特定的形式(例如#_xxxx_#),那麼你應該確認它是該格式。如果您使用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> = 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';
}
?>
驗證輸入的格式,讓你馬上知道數據是否被篡改’秒。然後你可以採取相應的行動
有趣:-)。將結合你的Rajan Rawal建議使用'is_numeric()' –
@DaanTimmer no,'is_numeric('0xfe')== true'這可能不是你想要的;如果你想測試整數,你可以使用'filter_var' –
我更新了我的答案以擴展安全性。感謝您提出filter_var @Jack – Herbert