用于限制字符不正常的正则表达式

时间:2016-01-14 05:43:45

标签: php regex

我想将“b”的数量限制在1到6之间,我正在使用以下代码:

<?php
$str="Big black books being kept in a black bag of a beautiful babe";
$pattern="/(b){1,6}/";
   if(!preg_match($pattern,$str,$matches))
 {
 echo "Please use six bs";
 }else
 {/*do nothing*/}
 print_r($matches);
 ?>

但它不起作用。我究竟做错了什么?

3 个答案:

答案 0 :(得分:5)

仅通过正则表达式。

$str="Big black books being kept in a black bag of a beautiful babe";
$pattern="/^([^b]*b){1,6}[^b]*$/";
   if(!preg_match($pattern,$str,$matches))
 {
 echo "Please use upto six bs";
 }else
 {/*do nothing*/}
 print_r($matches);

并注意这必须除了至少一个b。如果您还希望匹配不具有任何单b的行,请使用/^([^b]*b){0,6}[^b]*$/

如果您还要计算资本i,请添加不区分大小写的修饰符B

<强>解释

  • ^开始行。
  • ([^b]*b){1,6}匹配(零个或多个非b字符和b)(1到6次)。因此,这可确保必须存在最少1次且最多6次的b字符。
  • [^b]*匹配任何字符,但不匹配b,零次或多次。这可确保不再存在b
  • $行边界结束..

答案 1 :(得分:0)

尝试使用匹配计数。

<?php
    $str="Big black books being kept in a black bag of a beautiful babe";
    preg_match_all("/(b)/i",$str,$matches);
    if(isset($matches[1]) && count($matches[1]) > 6 )
    {
        echo "Please use six bs";
    }else
    {/*do nothing*/}
    print_r($matches);
?>

答案 2 :(得分:0)

我认为你想要计算整个字符串中B的数量,而正则表达式只计算行数。即“bbb”或只是“b”将返回一个匹配。

尝试使用substr_count来实现我想要的效果。这是一个例子。

<?php
    $str = "Big black books being kept in a black bag of a beautiful babe";
    if(substr_count($str, "b") > 6)
        echo "Six is the limit...";
    else
        echo "Doing nothing...";
?>

但是,当然,如果你想查看找到的匹配项,那将无济于事。