PHP的PREG正则匹配

    var_dump(preg_repalce('/.*/i','ok','2'));           // string(4) "okok" 
    var_dump(preg_replace('/.*/i','ok','2333'));      // string(4) "okok" 

这两句的替换是如何发生的?
是否是后向引用,或者其他原因,麻烦详细解释下(不要仅说原因,解释下why)。


    var_dump(preg_replace('/(.*)/ie','strtolower("\\1")','{${phpinfo()}}'));        // phpinfo() 执行成功 并输出 string(0) "" 
    var_dump(preg_replace('/(.*)/ie','strtolower("{${phpinfo()}}")','{${phpinfo()}}'));   // phpinfo() 执行成功 并输出 string(0) "" 
    // strtolower("{${phpinfo()}}") 执行后相当于 strtolower("{${1}}") 又相当于 strtolower("{null}") 又相当于 '' 空字符串

了解过可变变量,比如$a="hello"; $$a="world"; echo $a.${$a}; 。但是不理解这里的{${phpinfo()}}。

在PHP语言中单引号和双引号是有区别的,单引号代表纯字符串,双引号则会解析中间变量。
但是,eval(strtolower("{${phpinfo()}}"));中phpinfo()是如何执行phpinfo()是函数不是变量,如何解析。

先匹配整个串,执行一次替换,然后.*又可以匹配空字符串,又替换了一次,所以就是okok。下面是js的替换过程

img

第二个问题可以参考下面的文章,说得比较详细
https://blog.csdn.net/giaogiao123/article/details/121217533

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632