被正则玩疯了,为什么$matches[0]为空? 正则php断言 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 $_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标记,只在文本方式下才能看到 $_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" -->‘;才能被匹配到 我了个去!!!忘记了HTML的注释标记,晕,真的昏了一晚上啊,感谢提醒。 还是不太懂,是不是用了 ^ 之后,只能从 $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';} 不是,其实我想写个类似django这样的URL路由功能,如果按上面的方法的话,扩展性不够强,所以想用正则表达 $str='www/bbs/net/xxx/';if(preg_match('/^bbs.+?/', $str)){ echo '以bbs开头';}else{ echo 'exe';} 简单的问题 XMLHttpRequest接收php传递的汉字 把内容写入txt文件中的内容,在线等 PHP 聊天功能原理 (是类似网页上的客服系统__非聊天室) 问个服务器日志的正则怎么写 php 网站sql注入漏洞 求一段判断FLASH(即.SWF)上传时文件大小的代码????谢谢! 请问高手:怎么样写配置文件? 哪个有无限分类的代码。我这里有一个,但在递归显示时,出错, 请问如何这样设定变量?…… PHP+mysql登陆问题和sesiion问题 mkdir("testing")问题求解
<!-- 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标记,只在文本方式下才能看到
$_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" -->‘;才能被匹配到
我了个去!!!忘记了HTML的注释标记,晕,真的昏了一晚上啊,感谢提醒。
还是不太懂,是不是用了 ^ 之后,只能从 $content[0] 开始比较?前面的字串相同就进行匹配, $ 同理?
$string = 'bbs/csdn/net/xxx';如果字符串不是以bbs开头的就进行匹配
比如 $string = 'www/csdn/net/xxx';
因为不以 bbs 开头,继续匹配我想到一种写法
preg_match( '#((?!bbs/).)*#', 'www/csdn/net/xxx/', $matches);
但感觉这个效率有点低下,不知道还能不能优化一下?
$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';
}