preg_replace如何替换成preg_replace_callback

php中文网
发布: 2016-06-23 13:51:06
原创
1328人浏览过

小弟以前从事Delphi开发,被社会所迫学习了PHP,今天当头一棒直接蒙了。
这个怎么改啊,程序报错需要将preg_replace替换成preg_replace_callback

$fields = preg_replace('/([a-zA-Z0-9_]+).([a-zA-Z0-9_*]+)/e', "$this->_getFieldTable('\1') . '.\2'", $fields);
登录后复制

Swapface人脸交换
Swapface人脸交换

一款创建逼真人脸交换的AI换脸工具

Swapface人脸交换 45
查看详情 Swapface人脸交换

回复讨论(解决方案)

这太难了!!!!

$fields = preg_replace('/([a-zA-Z0-9_]+).([a-zA-Z0-9_*]+)/', function($r) {  return $this->_getFieldTable($r[1]) . $r[2];  }, $fields);
登录后复制

$fields = preg_replace('/([a-zA-Z0-9_]+).([a-zA-Z0-9_*]+)/', function($r) {  return $this->_getFieldTable($r[1]) . $r[2];  }, $fields);
登录后复制

报错
Object of class Closure could not be converted to string

那你原来就报错

$fields = preg_replace_callback('/([a-zA-Z0-9_]+).([a-zA-Z0-9_*]+)/', array($this, "_getFieldTable"), $fields);

不过_getFieldTable要改一下了,因为接收的是一个数组了。

附源码,大神帮我看看

**     *    获取查询时的字段列表     *     *    @author    Garbin     *    @param     string $src_fields_list     *    @return    string     */    function getRealFields($src_fields_list)    {        $fields = $src_fields_list;        if (!$src_fields_list)        {            $fields = '';        }        //$fields = preg_replace('/([a-zA-Z0-9_]+).([a-zA-Z0-9_*]+)/e', "$this->_getFieldTable('\1') . '.\2'", $fields);		$fields = preg_replace_callback('/([a-zA-Z0-9_]+).([a-zA-Z0-9_*]+)/', function($r) {return $this->_getFieldTable($r[1]) . $r[2];}, $fields);	        //$fields = preg_replace_callback('/([a-zA-Z0-9_]+).([a-zA-Z0-9_*]+)/',function($r){ return $this->_getFieldTable($r(1) . $r(2));}, $fields);		return $fields;    }    /**     *    解析字段所属     *     *    @author    Garbin     *    @param     string $owner     *    @return    string     */    function _getFieldTable($owner)    {        if ($owner == 'this')        {            return $this->alias;        }        else        {            $m =& m($owner);            if ($m === false)            {                /* 若没有对象,则原样返回 */                return $owner;            }            return $m->alias;        }    }
登录后复制

15,16行我是用xuzuning大神的。


        //$fields = preg_replace('/([a-zA-Z0-9_]+).([a-zA-Z0-9_*]+)/e', "$this->_getFieldTable('\1') . '.\2'", $fields);        $fields = preg_replace_callback('/([a-zA-Z0-9_]+).([a-zA-Z0-9_*]+)/', function($r) {return $this->_getFieldTable($r[1]) . $r[2];}, $fields);           //$fields = preg_replace_callback('/([a-zA-Z0-9_]+).([a-zA-Z0-9_*]+)/',function($r){ return $this->_getFieldTable($r(1) . $r(2));}, $fields);        return $fields;
登录后复制


组合的查询语句是这个样子的
MySQL Error[1054]: Unknown column 'user_privprivs' in 'field list' MySQL Query:SELECT user_privprivs, sstore_name,user_privuser_id,s.store_id FROM ecm_store s LEFT JOIN ecm_user_priv user_priv ON s.store_id = user_priv.store_id WHERE user_priv.user_id IN ('1') ORDER BY sstore_id DESC Wrong File: eccoremodelmysql.php[534]
登录后复制


正确的应该是这个样子
SELECT user_priv.privs, s.store_name,user_priv.user_id,s.store_id FROM ecm_store s LEFT JOIN ecm_user_priv user_priv ON s.store_id = user_priv.store_id WHERE user_priv.user_id IN ('1') ORDER BY s.store_id DESC
登录后复制

错误的问题是: user_priv.privs和user_priv.user_id和s.store_id重点引用“.”都没有了。

噢,漏了个点

$fields = preg_replace('/([a-zA-Z0-9_]+).([a-zA-Z0-9_*]+)/', function($r) {  return $this->_getFieldTable($r[1]) . ".$r[2]";  }, $fields);
登录后复制

最后一个,谢谢xuzuning大神。最后面的preg_replace怎么替换

    /**     * 替换模块中图片路径     *     * @author liupeng     * @param  string  $source 内容     * @return string     **/    function smarty_prefilter_preCompile($source)    {        $file_type = strtolower(strrchr($this->_current_file, '.'));        $tmp_dir = '' ;        /* 替换文件编码头部 */        if (strpos($source, "") !== FALSE)        {            $source = str_replace("", '', $source);        }        if ($this->store_id > 0)        {            if (strpos($this->_current_file, '/mall/resource') !== false)            {                $mall_skin = $this->options['mall_skin'];                $tmp_dir = "themes/mall/skin/$mall_skin/" ;            }            else            {                $tmp_dir = "themes/store/skin/" . $this->skin . '/' ;            }        }        else {            $tmp_dir = "themes/mall/skin/" . $this->skin . '/' ;        }        $pattern = array(            '/<!--[^>|
]*?({.+?})[^<|{|
]*?-->/', // 替换smarty注释            '/<!--[^<|>|{|
]*?-->/',               // 替换不换行的html注释            '/(href=["|'])../(.*?)(["|'])/i',  // 替换相对链接            '/((?:background|src)s*=s*["|'])(?:./|../)?(images/.*?["|'])/is', // 在images前加上 $tmp_dir            '/((?:background|background-image):s*?url()(?:./|../)?(images/)/is', // 在images前加上 $tmp_dir            '/{nocache}(.+?){/nocache}/ise', //无缓存模块            );        $replace = array(            '',            '',            '',            '' . $tmp_dir . '',            '' . $tmp_dir . '',            "'{insert name="nocache" ' . '" . $this->_echash . "' . base64_encode('\1') . '}'",            );        return preg_replace($pattern, $replace, $source);	    }
登录后复制

需要修改的只是最后一对:

$source = preg_replace_callback( '/{nocache}(.+?){/nocache}/is', function($r) {    return '{insert name="nocache" '  . $this->_echash .  base64_encode($r[1]) . '}'; }, $source);
登录后复制

徐总给力啊,

    function fetch_str($source)    {        if (!defined('IS_BACKEND'))        {            $source = $this->smarty_prefilter_preCompile($source);        }        return preg_replace("/{([^}{
]*)}/e", "$this->select('\1');", $source);    }
登录后复制

/e 就是 eval("return 串")
你脱去外层的引号就对了

function($r) {
  return $this->select($r[1]);
}

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号