Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP将值绑定到JSON字符串_Php_Json - Fatal编程技术网

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

使用PHP将值绑定到JSON字符串,php,json,Php,Json,使用PHP,我希望将一个值绑定到JSON字符串,类似于使用问号为数据库准备SQL语句时的做法。例如,我希望执行以下操作: $v1 = 'v1'; $k2 = 'k2'; $result = json_bind('[{"k1": ?}, {?: "v2"}]', $v1, $k2); echo $result; // [{"k1": "v1"}, {"k2": "v2"}] 我不想只做纯字符串替换,因为这种技术不能正确地转义/引用值,也不能正确地格式化数组和对象之类的值。 我不想先创建一个数组或

使用PHP,我希望将一个值绑定到JSON字符串,类似于使用问号为数据库准备SQL语句时的做法。例如,我希望执行以下操作:

$v1 = 'v1';
$k2 = 'k2';
$result = json_bind('[{"k1": ?}, {?: "v2"}]', $v1, $k2);
echo $result; // [{"k1": "v1"}, {"k2": "v2"}]
我不想只做纯字符串替换,因为这种技术不能正确地转义/引用值,也不能正确地格式化数组和对象之类的值。 我不想先创建一个数组或对象,分配参数,然后使用json_encode,因为这会变得很混乱,因为PHP的语法不同于json的语法,我需要一些更动态的东西,因为我可能并不总是知道json的结构。 是否已经有一个库或函数可以完成这项工作

是否已经有一个库或函数可以完成这项工作


不。

使用简单的正则表达式标记器是可行的——主要是跳过字符串

#-- 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结构和大多数字符串,以获得更好的正则表达式。这就是你可以找到文字的方式?占位符


值得注意的是,这并没有考虑到语义无效的模板,比如JSON键的数组参数,例如,

您怎么可能不知道JSON结构?如果您无法区分问号是键还是值,那么向函数传递值以将值绑定到字符串还有什么用途

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

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


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

什么是json?这是一个用来演示我想做什么的组合函数。preg_replace_callbackpreg_replace_callback回调不一定能区分文本中的问号和其他地方的问号。寻找一种更适合词法分析器的方法。对我来说,有效的方法是将所有内容放入一个关联数组中,然后对其进行json_编码。键和值是分开的,函数负责正确地写入json字符串answer@RiggsFolly为什么不呢?这就是问题的答案。那么正确答案应该是什么呢?OP想要什么的完整实现?这是一个注释,而不是一个注释answer@RiggsFolly我不同意。评论用于澄清问题或提供提示。问题很清楚,答案也很清楚。这只是一个简短的问题。这彻底地回答了这个问题,虽然不是很解释。这比这里提到的要好得多:虽然是一个漂亮的解决方案,OP不想使用json_encode@C.vanDorstenOP不想使用json_编码作为手动数组构造的一部分。这并不意味着零使用。人们似乎被我说的我可能并不总是知道JSON的结构这一事实所困扰。所以让我澄清一下……在一个封闭的环境中,我可能有两三个JSON模板。每个都有相似的结构,但略有不同。例如,{order:{customer:{id:?}}}和{customer:{id:?}}。我想创建一个简单的方法,它有两个参数:addCustomerId$json$id?换成:.$id粗略地说就是,你拥有你想要的,尽管你一开始说你不想要。