使用PHP将值绑定到JSON字符串

问题描述 投票:0回答:3

使用PHP,我想将一个值绑定到一个JSON字符串,类似于在使用问号为数据库准备SQL语句时的操作方式。例如,我想做类似以下的事情:

$v1 = 'v1';
$k2 = 'k2';
$result = json_bind('[{"k1": ?}, {?: "v2"}]', $v1, $k2);
echo $result; // [{"k1": "v1"}, {"k2": "v2"}]
  1. 我不想只是做一个纯字符串替换,因为这种技术不能正确地转义/引用值,它不能正确地格式化数组和对象之类的值。
  2. 我不想首先创建一个数组(或一个对象),指定我的参数,并使用json_encode,因为这会变得混乱,因为PHP的语法与JSON的语法不同,我需要更动态的东西,因为我可能并不总是知道结构JSON。

是否已经存在可以执行此操作的库或函数?

php json
3个回答
0
投票

它有点像一个简单的正则表达式“标记器” - 通过大多数跳过字符串。

#-- Replace `?` placeholders
function json_bind($template, ...$vars) {
    return preg_replace_callback(
        '/
            [{}[\],:] \K |             # meta chars
            (true|false|null) \K |     # literals
            [-+\d.e]+ \K |             # numbers
            "([^"\\\\]+|\\\\.)*" \K |  # strings
            ([?])        # placeholder (do not skip)
         /x',
         function ($m) use (& $vars) {
             if ($m[0] == "?") {
                 return json_encode(array_shift($vars));
             }
         },
         $template
    );
}

虽然这不是一个非常完整/干净的正则表达式,但它应该跳过大多数标准JSON结构和大多数字符串(请参阅Regex to validate JSON以获得更好的正则表达式)。这是你如何找到文字?占位符。

值得注意的是,它没有处理语义上无效的模板,例如JSON键的数组参数,例如


1
投票

是否已经存在可以执行此操作的库或函数?

没有。


0
投票

你怎么不知道JSON结构?如果您无法将问号区分为键或值,那么将值传递给函数以将值绑定到字符串是什么?

有一次你说我确实知道我想要绑定什么,并且我以任意方式将它传递给一个函数,尽管我对源JSON字符串的结构没有任何线索。因此,我不知道结果是否正确。

为什么有人想要这样的东西?

你只需要回答@Bart Friederichs的答案。这是您问题的唯一正确答案。

© www.soinside.com 2019 - 2024. All rights reserved.