本帖最后由 aier520 于 2012-04-01 18:49:18 编辑

解决方案 »

  1.   

    基础代码
    $s = <<< TXT
    <td>1234567890</td>
    <td>1234567890123</td>
    <td>0987654321</td>
    <td>3210987654321</td>
    <td>1324354657</td>
    <td>1324354657689</td>
    TXT;
    preg_match_all('/(\d{13})|(\d{10})/s', $s, $r);
    print_r($r);
    Array
    (
        [0] => Array
            (
                [0] => 1234567890
                [1] => 1234567890123
                [2] => 0987654321
                [3] => 3210987654321
                [4] => 1324354657
                [5] => 1324354657689
            )    [1] => Array
            (
                [0] => 
                [1] => 1234567890123
                [2] => 
                [3] => 3210987654321
                [4] => 
                [5] => 1324354657689
            )    [2] => Array
            (
                [0] => 1234567890
                [1] => 
                [2] => 0987654321
                [3] => 
                [4] => 1324354657
                [5] => 
            ))
      

  2.   

    这个正则表达式
    preg_match_all('/(\d{13})|(\d{10})/s', $s, $r);
    为什么不能这样写
    preg_match_all('/(\d{10})|(\d{13})/s', $s, $r);
    就是把10  和13  的位置换了下就不行了,为什么呢?
      

  3.   

    \d{10}放到前面的话 会优先匹配10个连续数字,遇到13连续数字会匹配前10个,所以会出错,可以修改成如下
    preg_match_all('/(\d{10}\b)|(\d{13}\b)/s', $s, $r);
    print_r($r);加上\b指定边界
      

  4.   

    (\d{10})  匹配10位数字。因为你每个td里面都>=10位 满足条件。因此在第一个子模式中就匹配到了。你可以用两个正则来形成两个数组就简单多了。