【问题标题】:Check if variable has a number php检查变量是否有数字php
【发布时间】:2010-10-28 10:51:59
【问题描述】:

我想检查一个变量中是否有一个数字,我只是想看看是否有一个我不在乎它是否有其他东西像这样:

"abc" - false
"!./#()" - false
"!./#()abc" - false
"123" - true
"abc123" - true
"!./#()123" - true
"abc !./#() 123" -true

如果您想知道所有数字,但如果它只有一个,则可以使用简单的方法来做到这一点。感谢您的帮助。

【问题讨论】:

    标签: php variables numbers


    【解决方案1】:

    你可以使用strcspn函数:

    if (strcspn($_REQUEST['q'], '0123456789') != strlen($_REQUEST['q']))
      echo "true";
    else
      echo "false";
    

    strcspn 返回不包含任何整数的部分的长度。我们将它与字符串长度进行比较,如果它们不同,那么一定是一个整数。

    不需要为此调用正则表达式引擎。

    【讨论】:

    • 我对这个进行了基准测试,它比正则表达式快了大约 80%。
    • 很好——我什至没有对它进行基准测试,我只是认为必须有一个相对简单的字符串函数我可以使用而不是拔出大锤子(正则表达式)......
    • 这个功能对我来说是一个新功能,可惜它有一个可怕的名字(它代表什么?)它是如此接近它的反对:strspn。 IMO 这段代码比正则表达式更难理解,这需要做一些事情;)
    • 感谢您的信息,我以前使用过这些功能,但不是这样。我喜欢任何跑得更快的东西!
    • 谢谢@MartinGeisler 我真的发现这个功能很有用。但是我认为另一个函数以类似的方式起作用。 (strpbrk($var, '0123456789') 例如下面附上测试用例。
    【解决方案2】:
    $result = preg_match("/\\d/", $yourString) > 0;
    

    【讨论】:

    • 谢谢,我之前试过了,但由于某种原因没有用。
    • 你可能想要正确地转义反斜杠——这里你依赖于 \d 不是一个有效的转义序列这一事实,因此它将被视为你写了 \\d。
    • 您对转义的看法是正确的(不过我并没有依赖某些东西,我只是忘记了)。已更正,谢谢提示。
    • @therefromhere:具有讽刺意味的是,这甚至被否决了。虽然我预计 strcspn() 的速度优势与 99% 的用例无关。
    【解决方案3】:

    秉承@Martin 的精神,我发现了另一个以类似方式工作的函数。

    (strpbrk($var, '0123456789')
    

    例如测试用例

    <?php
    
    function a($var) {
        return (strcspn($var, '0123456789') != strlen($var));
    }
    
    function b($var) {
        return (strpbrk($var, '0123456789'));
    }
    
    $var = array("abc", "!./#()", "!./#()abc", "123", "abc123", "!./#()123", "abc !./#() 123");
    
    foreach ($var as $v) {
        echo $v . ' = ' . b($v) .'<hr />';
    }
    
    ?>
    

    【讨论】:

    • 这应该是更快的解决方案
    【解决方案4】:

    这应该对你有帮助:

    $numberOfNumbersFound = preg_match("/[0-9]+/", $yourString);
    

    您可以从 preg_match 函数中获得更多信息,请查看its manual

    【讨论】:

    • 完美,您只需查看if( $numberOfNumbersFound &gt; 0 ) 谢谢!
    【解决方案5】:

    您可以使用此模式使用正则表达式测试您的字符串:

    $isNumeric = preg_match("/\S*\d+\S*/", $string) ? true : false;
    

    【讨论】:

    • 哎呀!花了一分钟来纠正模式,然后BAWNG!投了反对票。你们是快人! ;P
    • 如果 "asdf 123asdf" 将不起作用,为什么不只使用 ([0-9]+)
    • 我猜最快的反对票来自我,但不是正则表达式而是 ?真假; (==0 也会做同样的事情,如果你坚持 $isNumeric 是一个布尔值,但是在 PHP 中你可以只将 preg_match 结果分配给 $isNumeric 然后将 $isNumeric 作为一个布尔值,sinec 任何 0 都是真的和 0 错误。我绝对讨厌 IF (boolean) THEN TRUE ELSE FALSE 之类的代码
    • 我测试了它并且它工作。我复制了您提供的相同字符串:“asdf 123asdf”,它返回“true”。根据问题的第六个例子,它应该返回 true。在正则表达式中,有很多方法可以定义模式,我确信 [0-9]+ 是正确的,单个 \d 也是正确的。我在这里推荐的模式也是正确的。我投了反对票,因为在我发表答案的那一刻,我错过了模式中的星号(我是这么认为的)。正如他自己所说,因为 MasterPeter 不喜欢我使用的三元运算符。
    猜你喜欢
    • 2013-10-14
    • 2011-01-12
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    相关资源
    最近更新 更多