Search code examples
phpnumbersrangedetect

Detect if a string contains any numbers


This is the test.php file:

$string = 'A string with no numbers';

for ($i = 0; $i <= strlen($string)-1; $i++) {
    $char = $string[$i];
    $message_keyword = in_array($char, range(0,9)) ? 'includes' : 'desn\'t include';
}

// output
echo sprintf('This variable %s number(s)', codeStyle($message_keyword));

// function
function codeStyle($string) {
    return '<span style="background-color: #eee; font-weight: bold;">' . $string . '</span>';
}

It splits the string character by character and checks if the character is a number or not.

Problem: Its output is always "This variable includes number(s)". Please help me to find the reason. TIP: When I change range(0,9) to range(1,9) It works correctly (But it can't detect 0).


Solution

  • Use preg_match():

    if (preg_match('~[0-9]+~', $string)) {
        echo 'string with numbers';
    }
    

    Althought you should not use it, as it is much slower than preg_match() I will explain why your original code is not working:

    A non numerical character in the string when compared to a number (in_array() does that internally) would be evaluated as 0 what is a number. Check this example:

    var_dump('A' == 0); // -> bool(true)
    var_dump(in_array('A', array(0)); // -> bool(true)
    

    Correct would be to use is_numeric() here:

    $keyword = 'doesn\'t include';
    for ($i = 0; $i <= strlen($string)-1; $i++) {
        if(is_numeric($string[$i]))  {
           $keyword = 'includes';
           break;
        }
    }
    

    Or use the string representations of the numbers:

    $keyword = 'doesn\'t include';
    // the numbers as stings
    $numbers = array('0', '1', '2', /* ..., */ '9');
    
    for ($i = 0; $i <= strlen($string)-1; $i++) {
        if(in_array($string[$i], $numbers)){
           $keyword = 'includes';
           break;
        }
    }