写个正则,能正常匹配到,但我还需要他返回匹配的整条字符串
正则如下
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]值为 的)
还有一个问题,不知道为什么断言后就匹配不到,
preg_match( '/^<!--\sLayout\sname\s*=\s*"(.*)"\s-->$/', $_content, $matches);
就这样,末尾加了个美元符,就匹配不到任何东西了,虽然这个不影响,但我还是想知道是为什么,看网上的文档,一堆 术语头都晕了,希望高人解答,谢谢。
晕,怎么只能给100分啊,我有1000分的。。。
回复讨论(解决方案)
$_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('//', $_content, $matches);print_r($matches);/*Array( [0] => Array ( [0] => [1] => ) [1] => Array ( [0] => header [1] => footer ))*/
$matches[0]将包含完整模式匹配到的文本,它后面还有一句: $matches[1]将包含第一个捕获子组匹配到的文本, 以此类推.
意思应该是只包含你反捕获(也就是你的小括号括起来的内容),而不是执行的全局匹配,所以用preg_match_all来执行全局匹配
还有你的正则在最前面加了^,它表示你执行匹配的字符串必须已^之后的内容开始,所以是不能匹配到了
同理,$表示匹配的字符串必须以$之前的结尾,所以要匹配到内容,$_content='';或者$_content='‘;才能被匹配到
$_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的注释标记,晕,真的昏了一晚上啊,感谢提醒。
$_content='<!-- Layout name="header" --><!-- Layout name="footer" -->';preg_match_all('//', $_content, $matches);print_r($matches);/*Array( [0] => Array ( [0] => [1] => ) [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';}

PHP日志记录对于监视和调试Web应用程序以及捕获关键事件,错误和运行时行为至关重要。它为系统性能提供了宝贵的见解,有助于识别问题并支持更快的故障排除

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

Atom编辑器mac版下载
最流行的的开源编辑器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

禅工作室 13.0.1
功能强大的PHP集成开发环境