有文本内容:
<li><span class="end">44451</span><span class="num">1</span><a href="http://vip.book.sina.com.cn/book/index_100324.html" target="_blank">戴军:食色男女</a></li>现在想取 44451  和  戴军:食色男女  两项我的表达式:preg_match_all('!class="end">([0-9]*)(?:.*[>]{4})(.*)</a>!', $val, $sub_match);
该表达式匹配不到。(?:.*[>]{4})这里应该是有问题,但不知道怎么写,高手帮个忙了。

解决方案 »

  1.   

    零宽断言用得不好
    所以用个笨方法
    /class="end">(\d+).+?>([^\/]+?)<\/a>/is
      

  2.   

    呵呵,搞定了:preg_match_all('!class="end">([\d]*).*<a[^>]+>(.*)</a>!', $val, $sub_match);
      

  3.   

    !<span\s+class="end">([0-9][^<]*)<.*>(.[^<]*)</a>!
      

  4.   

    wxllyf兄, 零宽断言是匹配一个位置啊,所以,我觉得这里也不能用来解决我提的这个,不过,还是非常感谢了。只是 .+? 这是什么意思,一般是.*?哦
      

  5.   

    foolbirdflyfirst兄,表达式有问题,我测试,没通过。
      

  6.   

    问正则最好把所有的情况都说出来,只能根据你给的例子进行判断.
    $val = '<li> <span class="end">44451222 </span> <span class="num">1 </span> <a href="http://vip.book.sina.com.cn/book/index_100324.html" target="_blank">戴军:食色男女 </a> </li>';
    preg_match_all('!<span\s+class="end">([0-9][^<]*)<.*>(.[^<]*)</a>!', $val, $sub_match); 
    print_r($sub_match);
    //out put:Array ( [0] => Array ( [0] => 44451222  1  戴军:食色男女  ) [1] => Array ( [0] => 44451222 ) [2] => Array ( [0] => 戴军:食色男女 ) )
      

  7.   

    $preg='/<span\s+class=\"end\">([0-9]*)\s*<\/span>.*?<a[^>]+>?(.*) <\/a>/';
      

  8.   


    点号代表任意字符,加号是至少一个字符(>=1,星号任意多个字符(>=0),再加上个问号即为非贪婪搜索(即从左向右处理字符串),如果没有问号即为贪婪搜索(从右向左处理字符串)。
    单个问号为0个或1个(=0 or =1)。
    点号是字符,加、星、问号为字符的个数。