解决方案 »

  1.   

    $_content =<<< HTML
    <!-- Layout name="header" -->
    <!-- Layout name="footer" -->
    HTML;
    preg_match( '/^<!--\sLayout\sname\s*=\s*"(.*)"\s-->/', $_content, $matches);
    print_r($matches);Array
    (
        [0] => <!-- Layout name="header" -->
        [1] => header
    )
    没有问题只不过你是被你自己弄糊涂了
    $matches[0] 是一个html标记,只在文本方式下才能看到
      

  2.   


    $_content='<!-- Layout name="header" -->
    <!-- Layout name="footer" -->';
    preg_match_all('/<!--\sLayout\sname\s*=\s*"(.*?)"\s-->/', $_content, $matches);print_r($matches);
    /*
    Array
    (
        [0] => Array
            (
                [0] => <!-- Layout name="header" -->
                [1] => <!-- Layout name="footer" -->
            )    [1] => Array
            (
                [0] => header
                [1] => footer
            ))
    */$matches[0]将包含完整模式匹配到的文本,它后面还有一句:$matches[1]将包含第一个捕获子组匹配到的文本, 以此类推. 
    意思应该是只包含你反捕获(也就是你的小括号括起来的内容),而不是执行的全局匹配,所以用preg_match_all来执行全局匹配
    还有你的正则在最前面加了^,它表示你执行匹配的字符串必须已^之后的内容开始,所以<!-- Layout name="footer" -->是不能匹配到了
    同理,$表示匹配的字符串必须以$之前的结尾,所以要匹配到内容,$_content='<!-- Layout name="footer" -->';或者$_content='<!-- Layout name="header" -->‘;才能被匹配到
      

  3.   


    我了个去!!!忘记了HTML的注释标记,晕,真的昏了一晚上啊,感谢提醒。
      

  4.   


    还是不太懂,是不是用了 ^ 之后,只能从 $content[0] 开始比较?前面的字串相同就进行匹配, $ 同理?
      

  5.   

    还有一个问题希望能解决一下存在一字符串
    $string = 'bbs/csdn/net/xxx';如果字符串不是以bbs开头的就进行匹配
    比如 $string = 'www/csdn/net/xxx';
    因为不以 bbs 开头,继续匹配我想到一种写法
    preg_match( '#((?!bbs/).)*#', 'www/csdn/net/xxx/', $matches);
    但感觉这个效率有点低下,不知道还能不能优化一下?
      

  6.   

    ^是匹配输入字符串的开始位置,若待匹配的字符串不是以^之后的内容开始,根本就不会执行匹配若是只是判断字符串不是以bbs开头,这样比较快
    $str='/bbs/www/csdn/net/xxx/';
    if(strpos($str,'bbs')!=0 || strpos($str,'bbs')===false){
    //等于0就是以bbs开头,未找到返回false(全等于false)
    echo 'exe';
    }
      

  7.   


    不是,其实我想写个类似django这样的URL路由功能,如果按上面的方法的话,扩展性不够强,所以想用正则表达
      

  8.   


    $str='www/bbs/net/xxx/';
    if(preg_match('/^bbs.+?/', $str)){
    echo '以bbs开头';
    }else{
    echo 'exe';
    }