1.<?php
header('Content-Type:text/html;charset=utf-8');

$subject = 'AEbbdsfasdfad23';
$count = preg_match('/[a-z]{2,11}[0-9]$/', $subject);
echo $count;
特别是[a-z]{2,11},匹配2-11次出现的小写字母,为什么匹配不成功?2.<?php
header('Content-Type:text/html;charset=utf-8');

$subject = 'AEbbdsfasdfads23';
$count = preg_match('/[a-z]?[0-9]$/', $subject);
echo $count;
这条[a-z]?,匹配小字字母0或1次,但我小写字母已经不止1次了,为什么还可以匹配成功?

解决方案 »

  1.   

    $subject = 'AEbbdsfasdfad23';
    $count = preg_match('/[a-z]{2,11}[0-9]$/', $subject);
    echo $count;输出 0
    因为你需要匹配的是以单个数字符结尾([0-9]$)
    而 'AEbbdsfasdfad23' 最后是 2 个数字符subject = 'AEbbdsfasdfads23';
    $count = preg_match('/[a-z]?[0-9]$/', $subject);
    echo $count;
    输出 1
    既然你知道 [a-z]? 是匹配小字字母0或1次
    那么尾部的 3 前面不正好是 0 个字母吗?
      

  2.   

    1.第一个不成功的原因是因为[a-z]{2,11}[0-9]$表示以2-11位小写字母紧跟着一个以数字结尾的字符串是匹配不上的 改成[a-z]{2,11}[0-9]*$可以匹配上
    2[a-z]?[0-9]$表示匹配小字字母0或1次紧跟着一个以数字结尾的字符 因为小写的字母可以有也可以没有所以这个结果只匹配一个结尾的数字3
      

  3.   

    那如果我在第二个例子加了一对小括号:'/([a-z]?[0-9])$/'  为什么输出有两个3:<?php
    header('Content-Type:text/html;charset=utf-8');

    $subject = 'AEbbdsfasdfads23';
    $results = null;
    preg_match_all('/([a-z]?[0-9])$/', $subject, $results);
    var_dump($results);
    输出:
    array (size=2)
      0 => 
        array (size=1)
          0 => string '3' (length=1)
      1 => 
        array (size=1)
          0 => string '3' (length=1
      

  4.   

    不是应该只有一个3吗?
    array (size=1)
      0 => 
        array (size=1)
          0 => string '3' (length=1)
      

  5.   


    正则表达式中的圆括号的作用是对字符进行分组,并保存匹配的文本
    array (size=2)
      0 => //匹配出来的0表示整个匹配出来的值
        array (size=1)
          0 => string '3' (length=1)
      1 => //表示第一个括号匹配的结果
        array (size=1)
          0 => string '3' (length=1
    建议你去下个正则的手册看看 里面都是些基础的可以学习