检测字符串是否包含任何数字

2022-08-30 20:45:52

这是测试.php文件:

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

它逐个字符拆分字符串字符,并检查该字符是否为数字。

问题:其输出始终为“此变量包含数字”。请帮我找到原因。提示:当我更改为它工作时,它工作正常(但它无法检测到0)。range(0,9)range(1,9)


答案 1

用:preg_match()

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

虽然你不应该使用它,因为它比我解释为什么你的原始代码不起作用要慢得多:preg_match()

当字符串中的非数字字符与数字进行比较时(在内部执行此操作)将被计算为什么是数字。检查此示例:in_array()0

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

正确的做法是在这里使用:is_numeric()

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

或者使用数字的字符串表示形式:

$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;
    }
}

答案 2

你可以只使用正则表达式

$message_keyword = preg_match('/\d/', $string) ? 'includes' : 'desn\'t include';

推荐