Rumah > pembangunan bahagian belakang > tutorial php > 被正则玩疯了,为啥$matches[0]为空

被正则玩疯了,为啥$matches[0]为空

WBOY
Lepaskan: 2016-06-13 12:07:50
asal
838 orang telah melayarinya

被正则玩疯了,为什么$matches[0]为空?
写个正则,能正常匹配到,但我还需要他返回匹配的整条字符串

正则如下

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


$_content的内容是
<br /><!-- Layout name="header" --><br /><!-- Layout name="footer" -->
Salin selepas log masuk


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

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

还有一个问题,不知道为什么断言后就匹配不到,
<br />preg_match( '/^<!--\sLayout\sname\s*=\s*"(.*)"\s-->$/', $_content, $matches);<br />
Salin selepas log masuk

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

晕,怎么只能给100分啊,我有1000分的。。。
------解决思路----------------------
$_content =<<< HTML<br /><!-- Layout name="header" --><br /><!-- Layout name="footer" -->
HTML;<br />preg_match( '/^<!--\sLayout\sname\s*=\s*"(.*)"\s-->/', $_content, $matches);<br />print_r($matches);
Salin selepas log masuk
Array<br />(<br />    [0] => <!-- Layout name="header" --><br />    [1] => header<br />)<br />
Salin selepas log masuk
没有问题

只不过你是被你自己弄糊涂了
$matches[0] 是一个html标记,只在文本方式下才能看到
------解决思路----------------------
<br />$_content='<!-- Layout name="header" --><br /><!-- Layout name="footer" -->';<br />preg_match_all('/<!--\sLayout\sname\s*=\s*"(.*?)"\s-->/', $_content, $matches);<br /><br />print_r($matches);<br />/*<br />Array<br />(<br />    [0] => Array<br />        (<br />            [0] => <!-- Layout name="header" --><br />            [1] => <!-- Layout name="footer" --><br />        )<br /><br />    [1] => Array<br />        (<br />            [0] => header<br />            [1] => footer<br />        )<br /><br />)<br />*/<br />
Salin selepas log masuk

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

若是只是判断字符串不是以bbs开头,这样比较快
$str='/bbs/www/csdn/net/xxx/';<br />if(strpos($str,'bbs')!=0 <br><font color='#FF8000'>------解决思路----------------------</font><br> strpos($str,'bbs')===false){<br />	//等于0就是以bbs开头,未找到返回false(全等于false)<br />	echo 'exe';<br />}
Salin selepas log masuk

------解决思路----------------------
<br />$str='www/bbs/net/xxx/';<br />if(preg_match('/^bbs.+?/', $str)){<br />	echo '以bbs开头';<br />}else{<br />	echo 'exe';<br />}<br />
Salin selepas log masuk

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan