• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

php 搞代码 4年前 (2022-01-23) 28次浏览 已收录 0个评论
文章目录[隐藏]

写个正则,能正常匹配到,但我还需要他返回匹配的整条字符串

正则如下

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

$_content的内容是

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

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

Array(    [0] =>     [1] => header)

$matches[0]为什么会为空?说好的匹配到的文本呢?(我原意是想$matches[0]值为 的)

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

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

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

晕,怎么只能给100分啊,我有1000分的。。。

回复讨论(解决方案)

$_content =<<< HTML<!---ecms -ecms -ecms  Layout name="header" --><!---ecms -ecms -ecms  Layout name="footer" -->HTML;preg_match( '/^<!---ecms -ecms -ecms \sLayout\sname\s*=\s*"(.*)"\s-->/', $_content, $matches);print_r($matches);
Array(    [0] => <!---ecms -ecms -ecms  Layout name="header" -->    [1] => header)

没有问题

只不过你是被你自己弄糊涂了
$matches[0] 是一个html标记,只在文本方式下才能看到

$_content='<!---ecms -ecms -ecms  Layout name="header" --><!---ecms -ecms -ecms  Layout name="footer" -->';preg_match_all('/<!---ecms -ecms -ecms \sLayout\sname\s*=\s*"(.*?)"\s-->/', $_content, $matches);print_r($matches);/*Array(    [0] => Array        (            [0] => <!---ecms -ecms -ecms  Layout name="header" -->            [1] => <!---ecms -ecms -ecms  Layout name="footer" -->        )    [1] => Array        (            [0] => header            [1] => footer        ))*/

$matches[0]将包含完整模式匹配到的文本,它后面还有一句: $matches[1]将包含第一个捕获子组匹

2本文来源gao!daima.com搞$代!码网

搞代gaodaima码配到的文本, 以此类推.
意思应该是只包含你反捕获(也就是你的小括号括起来的内容),而不是执行的全局匹配,所以用preg_match_all来执行全局匹配
还有你的正则在最前面加了^,它表示你执行匹配的字符串必须已^之后的内容开始,所以是不能匹配到了
同理,$表示匹配的字符串必须以$之前的结尾,所以要匹配到内容,$_content=’‘;或者$_content=’‘;才能被匹配到

$_content =<<< HTML<!---ecms -ecms -ecms  Layout name="header" --><!---ecms -ecms -ecms  Layout name="footer" -->HTML;preg_match( '/^<!---ecms -ecms -ecms \sLayout\sname\s*=\s*"(.*)"\s-->/', $_content, $matches);print_r($matches);
Array(    [0] => <!---ecms -ecms -ecms  Layout name="header" -->    [1] => header)

没有问题

只不过你是被你自己弄糊涂了
$matches[0] 是一个html标记,只在文本方式下才能看到

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

$_content='<!---ecms -ecms -ecms  Layout name="header" --><!---ecms -ecms -ecms  Layout name="footer" -->';preg_match_all('/<!---ecms -ecms -ecms \sLayout\sname\s*=\s*"(.*?)"\s-->/', $_content, $matches);print_r($matches);/*Array(    [0] => Array        (            [0] => <!---ecms -ecms -ecms  Layout name="header" -->            [1] => <!---ecms -ecms -ecms  Layout name="footer" -->        )    [1] => Array        (            [0] => header            [1] => footer        ))*/

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

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

还有一个问题希望能解决一下

存在一字符串

$string = 'bbs/csdn/net/xxx';

如果字符串不是以bbs开头的就进行匹配
比如

$string = 'www/csdn/net/xxx';

因为不以 bbs 开头,继续匹配

我想到一种写法

preg_match( '#((?!bbs/).)*#', 'www/csdn/net/xxx/', $matches);

但感觉这个效率有点低下,不知道还能不能优化一下?

^是匹配输入字符串的开始位置,若待匹配的字符串不是以^之后的内容开始,根本就不会执行匹配

若是只是判断 字符串不是以bbs开头,这样比较快

$str='/bbs/www/csdn/net/xxx/';if(strpos($str,'bbs')!=0 || strpos($str,'bbs')===false){	//等于0就是以bbs开头,未找到返回false(全等于false)	echo 'exe';}

^是匹配输入字符串的开始位置,若待匹配的字符串不是以^之后的内容开始,根本就不会执行匹配

若是只是判断 字符串不是以bbs开头,这样比较快

$str='/bbs/www/csdn/net/xxx/';if(strpos($str,'bbs')!=0 || strpos($str,'bbs')===false){	//等于0就是以bbs开头,未找到返回false(全等于false)	echo 'exe';}

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

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

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:被正则玩疯了,为什么$matches[0]为空?

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址