1

文字列を整数に変換する方法は複数あります。

$someString = substr($input, strripos($input, "_") + 1);
$i = $someString + 0;
$i = (int) $someString;
$i = intval($someString);

$someString使用入力から来るので、それを考慮に入れる必要があるかもしれません。どのオプションが「より良い」か、または最も悪い副作用がありますか?(つまり、パフォーマンス面、セキュリティ面で)

$input1_abcd_1またはのように見えることがあります1_abcd_2。これはかなり修正されています—この例で構成されているabcdを除いて。この入力はラジオボタンから行われますが、ユーザーは必要に応じていつでもデータを変更できます。したがって、悪意のあるデータを考慮する必要があります。

4

3 に答える 3

3

$i = (int) $someString;明確な型キャストが好きです。

于 2012-05-30T08:50:15.710 に答える
2

入力は数値にキャストされているため、セキュリティ上の問題はありません。パフォーマンスの違いはごくわずかです。ただし、最初の1つは、特定の場合に整数を生成しない場合があります。

たとえば、$input = '19.99';

$i = $someString + 0;    // $i = 19.99

他の2つのケースは同等ですが、$i = (int) $someString;平均して。よりも約56%高速です$i = intval($someString);。どちらも数ミリ秒で実行されるため、かなりのループで発生しない限り、パフォーマンスの違いは一般に無視できます。

$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> = 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';
}
?>

入力の形式を検証することで、データが改ざんされているかどうかをすぐに知ることができます。その後、それに応じて行動することができます。

于 2012-05-30T09:28:50.717 に答える
1

$ someStringが数値であることを確認したい場合は、使用できるのは

if(is_numeric($someString)){
   // proceed your code if $someString is numeric
}else{
   // proceed your code if $someString is not numeric
}
于 2012-05-30T09:12:56.527 に答える