检查字符串是否包含3个或更多数字组的最快方法

时间:2012-03-08 21:09:04

标签: php

所以基本上我需要检查一个字符串是否有3组或更多组的分隔数字,例如:

words1 words2 111 222 333      //> YES, it has 3 groups of digits (separated by space)

words 1 2                      //> NO

words 2011 words2 2012 2013    //> YES

我在想像

这样的东西
preg_match('/(\b\d+\b){3,}/',$string)

但它根本不起作用(总是返回假)

Thansk到@Basti我正在使用这个正则表达式:

'/(\D*\d+\D*){3,}/'

3 个答案:

答案 0 :(得分:1)

$non_numeric = array_filter(
    array_filter(explode(' ', $string)),
    function($c){
        return !is_numeric($c);
    });

if(count($non_numeric)) {
    //YES
}

答案 1 :(得分:1)

您可以使用此正则表达式来确保字符串中至少有3个数字:

#(?:\b\d+\b.*?){3}#

<强>测试

$arr = array(
'words1 words2 111 222 333',
'words 1 2',
'words 2011 words2 2012 2013',
'1 2 3',
'1 2 ab1',);
foreach ($arr as $u) {
   echo "$u => ";
   if (preg_match('#(?:\b\d+\b.*?){3}#', $u, $m))
      var_dump($m[0]);
   else
      echo " NO MATCH\n";
}

<强>输出:

words1 words2 111 222 333 => string(11) "111 222 333"
words 1 2 =>  NO MATCH
words 2011 words2 2012 2013 => string(21) "2011 words2 2012 2013"
1 2 3 => string(5) "1 2 3"
1 2 ab1 =>  NO MATCH

答案 2 :(得分:0)

您的正则表达式是“至少三次查找一个或多个数字”。你真正想要的是:“找到两个或更多数字,被我不关心的东西包围至少三次。”:

preg_match("/(\D*\d{2,}\D*){3,}/", $string)

表达式的问题在于您不允许除数字和单词边界之外的任何内容。

在你的三个琴弦上测试:var_dump(preg_match('/(\D*\d{2,}\D*){3,}/',$string, $match), $match);

int 1
array
  0 => string ' 111 222 333' (length=12)
  1 => string '333' (length=3)
int 0
array
  empty
int 1
array
  0 => string ' 2012 2013' (length=10)
  1 => string '13' (length=2)

yes123注意:

我正在使用我写的这个函数,它可以检查任意数量的组:

function countDigits($haystack) {
    preg_match_all('/\b\d+\b/',$haystack,$matches);
    return count($matches[0]);
}

echo countDigits('2011 abc 2012'); //> prints 2