15

这是 test.php 文件:

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

?>

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

问题:它的输出总是“这个变量包括数字”。请帮我找出原因。提示:当我更改range(0,9)range(1,9)它正常工作时(但它无法检测到 0)。

4

6 回答 6

26

使用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;
    }
}
于 2013-09-08T12:10:14.363 回答
8

您可以只使用regexp

$message_keyword = preg_match('/\d/', $string) ? 'includes' : 'desn\'t include';
于 2013-09-08T12:09:58.373 回答
2

更好的方法是使用正则表达式

<?php
    if (preg_match('#[0-9]#',$string)){
        $message_keyword = 'includes';
    }
    else{
        $message_keyword = 'desn\'t include';
    }  
?>
于 2013-09-08T12:18:08.407 回答
2

这是因为 PHP 松散类型比较,你是在比较字符串和整数,所以 PHP 内部会将此字符串转换为整数,并且字符串中的所有字符都将转换为 0。

修复代码的第一步是创建一个字符串数组而不是整数:

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

这将解决您的情况,但不会像您期望的那样工作,因为$message_keyword在每个循环上都会被覆盖,因此只会收到最后一个字符的消息。如果您的目标是仅检查字符串是否包含数字,则可以在遇到第一个数字后停止检查:

$message_keyword = 'doesn\'t include';
for ($i = 0; $i <= strlen($string)-1; $i++) {
    $char = $string[$i];
    if(in_array($char, $numbers)) {
        $message_keyword = 'includes';
        break; //found, no need to check next
    }   
}

要使所有逻辑以更紧凑的形式出现,请使用正则表达式,正如其他人之前发布的那样。

于 2013-09-08T12:23:35.323 回答
0
array range ( mixed $start , mixed $end [, number $step = 1 ] )

如果step给定一个值,它将用作elements序列中的增量。step应该作为positive number. 如果未指定,step 将默认为1.

在您的情况下,您没有提到第三个参数,这就是为什么它总是设置为1

在此处查看手册

于 2013-09-08T12:10:13.087 回答
0

大约 9 年后回答这个问题有点晚了,但如果你想检测整数(而不是浮点数),没有什么比ctype_digit. 使用此函数检测带小数点或其他类型的浮点数将导致返回false.

<?php
$number = "123";
$notNumber = "123abc";
var_dump(ctype_digit($number));
var_dump(ctype_digit($notNumber));
?>

输出

bool(true)
bool(false)
于 2022-02-11T12:26:00.620 回答