使用PHP将值绑定到JSON字符串
使用PHP,我希望将一个值绑定到JSON字符串,类似于使用问号为数据库准备SQL语句时的做法。例如,我希望执行以下操作:使用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"}] 我不想只做纯字符串替换,因为这种技术不能正确地转义/引用值,也不能正确地格式化数组和对象之类的值。 我不想先创建一个数组或
$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粗略地说就是,你拥有你想要的,尽管你一开始说你不想要。