21,886
社区成员
发帖
与我相关
我的任务
分享
preg_match( '/^<!--\sLayout\sname\s*=\s*"(.*)"\s-->/', $_content, $matches);
<!-- Layout name="header" -->
<!-- Layout name="footer" -->
Array
(
[0] =>
[1] => header
)
preg_match( '/^<!--\sLayout\sname\s*=\s*"(.*)"\s-->$/', $_content, $matches);
$str='www/bbs/net/xxx/';
if(preg_match('/^bbs.+?/', $str)){
echo '以bbs开头';
}else{
echo 'exe';
}
$str='/bbs/www/csdn/net/xxx/';
if(strpos($str,'bbs')!=0 || strpos($str,'bbs')===false){
//等于0就是以bbs开头,未找到返回false(全等于false)
echo 'exe';
}
$string = 'bbs/csdn/net/xxx';
如果字符串不是以bbs开头的就进行匹配
比如 $string = 'www/csdn/net/xxx';
因为不以 bbs 开头,继续匹配
我想到一种写法
preg_match( '#((?!bbs/).)*#', 'www/csdn/net/xxx/', $matches);
但感觉这个效率有点低下,不知道还能不能优化一下?
$_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 =<<< 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标记,只在文本方式下才能看到