PHP检测可变长度字符串包含除1以外的任何字符


PHP detect variable length string contains any character other than 1

使用PHP时,我有时会有如下字符串:

  • 111
  • 110
  • 011
  • 1111
  • 0110012

确定字符串是否包含任何字符其他,然后是字符1,最有效的方法是什么(最好不使用正则表达式)?

这里有一个单行代码解决方案,可以放入条件等中:

strlen(str_replace('1','',$mystring))==0

它去掉"1",看看是否还有剩余的东西。

用户Don't Panic评论说str_replace可以被trim:取代

strlen(trim($mystring, '1'))==0

它删除前导和尾随1,并查看是否还有剩余的内容。这适用于OP请求中的特定情况,但第一个选项也会告诉您有多少非"1"字符(如果该信息很重要)。根据实现的不同,trim的运行速度可能会稍快,因为PHP不必检查第一个和最后一个非"1"字符之间的任何字符。


您也可以使用类似于字符数组的字符串,从一开始就进行迭代,直到找到一个不是=='1'的字符(在这种情况下,返回true)或到达数组的末尾(在这种情形下,返回false)。


最后,尽管OP在这里说"最好不要正则表达式",但其他对正则表达式开放的人可能会使用一个:

 preg_match("/[^1]/", $mystring)==1

另一种方法:

if (base_convert($string, 2, 2) === $string) {
    // $string has only 0 and 1 characters.
}

由于你的$string基本上是一个二进制数,你可以用base_convert来检查它。

工作原理:

var_dump(base_convert('110', 2, 2)); // 110
var_dump(base_convert('11503', 2, 2)); // 110
var_dump(base_convert('9111111111111111111110009', 2, 2)); // 11111111111111111111000

如果base_convert的返回值与输入值不同,则除了01之外还有其他字符。

如果要检查字符串是否只有1字符:

if(array_sum(str_split($string)) === strlen($string)) {
    // $string has only 1 characters.
}

使用str_split检索所有单个数字,并使用array_sum求和。如果结果与字符串的长度不相同,则在1旁边的字符串中有其他数字。

另一个选项是处理类似字符串的符号数组,并检查不是1的内容。如果是-中断for循环:

for ($i = 0; $i < strlen($mystring); $i++) {
   if ($mystring[$i] != '1') {
       echo 'FOUND!';
       break;
   }
}