正则表达式不超过5位数或包含字符串

时间:2018-04-26 07:05:42

标签: php regex

我正在寻找一个正则表达式,如果字符串包含字符或仅包含5位数字或包含php字符串

,则返回true

尝试了这个^\D{0,5}$

但它不起作用

例如:

12345 - return true
1234455667&&&% . - true

123456 -false 
1234 - true 
FFGF - true 
empty string - true 

3 个答案:

答案 0 :(得分:2)

如果我理解正确的话。如果满足以下任何条件,您需要true

  • 包含不超过5位数
  • 空字符串
  • 至少包含非数字

我们可以使用|来区分这三个条件。

^(?:\d{0,5}|.*?\D.*)$

请注意,空字符串大小写也与\d{0,5}

匹配

答案 1 :(得分:1)

PHP代码(test online):

$str = '1234';
if (preg_match('~^(?(?=\d+$)\d{1,5}|.*)$~', $str)) {
    // true
}

如果您说数字不应该是5或更多,您应该为它们构建路径。一种方法是使用条件构造,PCRE支持(?()...)

^(?(?=\d+$)\d{1,5}|.*)$

Live demo

故障:

  • ^匹配输入字符串的开头
  • (?有条件的开始
    • (?=\d+$)正向前瞻,如果只是数字
    • \d{1,5}最多五个字符
    • |否则
    • .*匹配任何其他内容
  • )构造结束
  • $匹配输入字符串的结尾

答案 2 :(得分:1)

您可以匹配一个由1到4位数组成的字符串,或者为空,或者不是所有数字:

if (preg_match('~^(\d{1,5}|(?!\d+$).*)$~', $v)) {
    return true;
}

请参阅regex demo。详细说明:

  • ^ - 字符串开头
  • ( - 开始匹配的分组构造...
    • \d{1,5} - 1到5位
    • | - 或
    • (?!\d+$).* - 任意0个字符(除了换行符,添加s修饰符以使其与换行符匹配)尽可能多,但不等于所有数字
  • ) - 分组构造的结尾
  • $ - 字符串结束。

请参阅PHP demo

$strs = ['12345', '1234455667&&&% .', '123456', '1234', ''];

foreach ($strs as $v) {
    if (preg_match('~^(\d{1,5}|(?!\d+$).*)$~', $v)) {
        echo "$v: true\n";
    } else {
        echo "$v: false\n";
    }
}

输出:

12345: true
1234455667&&&% .: true
123456: false
1234: true
: true