ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

自定义解析函数PHP

2019-07-27 01:29:46  阅读:216  来源: 互联网

标签:variable-names php eval preg-replace-callback custom-function


我正在尝试从以下函数中删除eval.我尝试使用sprintf和${},但仍无法找到解决方案.

这里的功能:

function parseDbString(string $value = 'Looking for a good {{ $pippo }}'){
    $pippo='Pizza';
    return preg_replace_callback('/{{(.*?)}}/', function($res) use ($pippo) {
      // $val=${trim($res[1])}; Returns "Undefined variable: $pippo"
      $val=@eval("return ".trim($res[1]).";"); // Returns "Looking for a good Pizza"
      return isset($val) ? $val : $res[0];
    },$value);
}

解决方法:

所以,是的,eval()通常被认为是php中最高级别的“邪恶”之一.在大多数情况下,当一个任务有助于通过eval()或变量(基本上是打包得很差的数组)来解决时,这是一个不恰当存储/声明的数据的症状,通常最好的行动方案是一个完整的反思.

为了解决你的孤立问题而不从根本上重写自定义函数,我会提供一个较小的“邪恶”(但在我看来仍然是“邪恶”,因为它的使用存在风险) – GLOBALS&全球…

代码:(Demo)

function parseDbString(string $value = 'Looking for a good {{ $pippo }}'){
    global $pippo;                        // declare $pippo as a global variable
    $pippo = 'Pizza';
    return preg_replace_callback('/{{ \$(.*?) }}/', function($m) use ($pippo) {
        echo "Global: " , $GLOBALS['pippo'];
        echo "\n{$m[1]}\n";
        return $GLOBALS[$m[1]] ?? $m[0];  // null coalescing operator provides fallback
    },$value);
}
echo parseDbString();

输出:

Global: Pizza                    # <-- for demonstraton purposes
pippo                            # <-- for demonstraton purposes
Looking for a good Pizza         # <-- desired output

…为什么这个解决方法是一个“坏主意”,好吧,想象你有一个包含{{$db}}的字符串 – 这样一个公共变量名可能存在于你的全局变量列表中.因此,如果字符串中的{{variable}}与全局范围中的任何变量匹配,那么您将得到错误的结果.

现在,你应该怎么做?只需在数组中声明您的$pippo数据,这样就可以使用关联关系. (Demo)

function parseDbString(string $value = 'Looking for a good {{ $pippo }}'){
    $lookup = ['pippo' => 'Pizza'];
    return preg_replace_callback('/{{ \$(.*?) }}/', function($m) use ($lookup) {
        return $lookup[$m[1]] ?? $m[0];  // null coalescing operator provides fallback
    }, $value);
}
echo parseDbString();

根据您对输入数据的控制量,您现在可以在输入字符串中删除$pippo之前 – 这样可以消除一些不必要的字符.

如果你还在阅读,你可以使用strtr()或str_replace()来清理整个事情. (Demo)

function parseDbString(string $value = 'Looking for a good {{ $pippo }}'){
    $lookup = ['{{ $pippo }}' => 'Pizza'];  // this can be extended all you like!
    return strtr($value, $lookup);
}
echo parseDbString();

标签:variable-names,php,eval,preg-replace-callback,custom-function
来源: https://codeday.me/bug/20190727/1549196.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有