被正则玩疯了,为什么$matches[0]为空?

Zimmerk 2014-10-11 04:44:47
写个正则,能正常匹配到,但我还需要他返回匹配的整条字符串

正则如下

preg_match( '/^<!--\sLayout\sname\s*=\s*"(.*)"\s-->/', $_content, $matches);


$_content的内容是

<!-- Layout name="header" -->
<!-- Layout name="footer" -->


我知道只能匹配到第一条,但根据官方文档写的:$matches[0]将包含完整模式匹配到的文本
但我测试了很久,只能得到以下结果
Array
(
[0] =>
[1] => header
)

$matches[0]为什么会为空?说好的匹配到的文本呢?(我原意是想$matches[0]值为 <!-- Layout name="header" --> 的)

还有一个问题,不知道为什么断言后就匹配不到,

preg_match( '/^<!--\sLayout\sname\s*=\s*"(.*)"\s-->$/', $_content, $matches);

就这样,末尾加了个美元符,就匹配不到任何东西了,虽然这个不影响,但我还是想知道是为什么,看网上的文档,一堆 术语头都晕了,希望高人解答,谢谢。

晕,怎么只能给100分啊,我有1000分的。。。
...全文
275 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
果酱很好吃 2014-10-13
  • 打赏
  • 举报
回复

$str='www/bbs/net/xxx/';
if(preg_match('/^bbs.+?/', $str)){
	echo '以bbs开头';
}else{
	echo 'exe';
}
Zimmerk 2014-10-12
  • 打赏
  • 举报
回复
引用 6 楼 jam00 的回复:
^是匹配输入字符串的开始位置,若待匹配的字符串不是以^之后的内容开始,根本就不会执行匹配 若是只是判断字符串不是以bbs开头,这样比较快
$str='/bbs/www/csdn/net/xxx/';
if(strpos($str,'bbs')!=0 || strpos($str,'bbs')===false){
	//等于0就是以bbs开头,未找到返回false(全等于false)
	echo 'exe';
}
不是,其实我想写个类似django这样的URL路由功能,如果按上面的方法的话,扩展性不够强,所以想用正则表达
果酱很好吃 2014-10-12
  • 打赏
  • 举报
回复
^是匹配输入字符串的开始位置,若待匹配的字符串不是以^之后的内容开始,根本就不会执行匹配 若是只是判断字符串不是以bbs开头,这样比较快
$str='/bbs/www/csdn/net/xxx/';
if(strpos($str,'bbs')!=0 || strpos($str,'bbs')===false){
	//等于0就是以bbs开头,未找到返回false(全等于false)
	echo 'exe';
}
Zimmerk 2014-10-12
  • 打赏
  • 举报
回复
还有一个问题希望能解决一下 存在一字符串
$string = 'bbs/csdn/net/xxx';
如果字符串不是以bbs开头的就进行匹配 比如
$string = 'www/csdn/net/xxx';
因为不以 bbs 开头,继续匹配 我想到一种写法
preg_match( '#((?!bbs/).)*#', 'www/csdn/net/xxx/', $matches);
但感觉这个效率有点低下,不知道还能不能优化一下?
Zimmerk 2014-10-12
  • 打赏
  • 举报
回复
引用 2 楼 jam00 的回复:

$_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" -->‘;才能被匹配到
还是不太懂,是不是用了 ^ 之后,只能从 $content[0] 开始比较?前面的字串相同就进行匹配, $ 同理?
Zimmerk 2014-10-12
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
$_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标记,只在文本方式下才能看到
我了个去!!!忘记了HTML的注释标记,晕,真的昏了一晚上啊,感谢提醒。
果酱很好吃 2014-10-11
  • 打赏
  • 举报
回复

$_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" -->‘;才能被匹配到
xuzuning 2014-10-11
  • 打赏
  • 举报
回复
$_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标记,只在文本方式下才能看到

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧