PHP preg_替换json字符串化对象
我有一个我自己无法解决的正则表达式挑战,我有一个json字符串化文件,其中包含大量条目,因此,我不需要解码它并在所有项目上循环,只需使用PHP preg_替换json字符串化对象,php,json,object,preg-replace,stringify,Php,Json,Object,Preg Replace,Stringify,我有一个我自己无法解决的正则表达式挑战,我有一个json字符串化文件,其中包含大量条目,因此,我不需要解码它并在所有项目上循环,只需使用preg\u replace来删除具有特定id的特定项目 因此,我的json如下所示: [ { "id":"440", "type":"prospect", "fullname":"elizabeth cogelizabeth",
preg\u replace
来删除具有特定id的特定项目
因此,我的json如下所示:
[
{
"id":"440",
"type":"prospect",
"fullname":"elizabeth cogelizabeth",
"phone":"01768413081",
"..." : ""
},
{
"id":"436",
"type":"prospect",
"fullname":"mandy cogmandy",
"phone":"01697349008",
"..." : ""
}
]
我知道的是id
部分,所以我可以这样做
preg_replace('/{\"id\"\:\"440\".*?\"},/', '', $jsonBlob);
不幸的是,我的正则表达式没有计算最后一项,它不是以逗号,
结尾,而是以括号]
非常感谢您的帮助。提前感谢。您可以使用此正则表达式:
{\s*"id":"440"[^}]*}
作为字符串,即:
$re = "/{\\s*\"id\":\"440\"[^}]*}/im";
这假设id是JSON数组中的第一个值,但它将考虑空格。它使用[^}]*
抓取到}
的所有内容
由于您希望删除该项,因此可以将正则表达式更改为在匹配之前或之后查找逗号。我还提供了一种方法,用于匹配阵列中唯一的项目:
,\s*{\s*"id":"440"[^}]*}|{\s*"id":"440"[^}]*}\s*,|{\s*"id":"440"[^}]*}
启用x
间距后,阅读更容易:
,\s*{\s*"id":"440"[^}]*} |
{\s*"id":"440"[^}]*}\s*,|
{\s*"id":"440"[^}]*}
您可以使用此正则表达式:
{\s*"id":"440"[^}]*}
作为字符串,即:
$re = "/{\\s*\"id\":\"440\"[^}]*}/im";
这假设id是JSON数组中的第一个值,但它将考虑空格。它使用[^}]*
抓取到}
的所有内容
由于您希望删除该项,因此可以将正则表达式更改为在匹配之前或之后查找逗号。我还提供了一种方法,用于匹配阵列中唯一的项目:
,\s*{\s*"id":"440"[^}]*}|{\s*"id":"440"[^}]*}\s*,|{\s*"id":"440"[^}]*}
启用x
间距后,阅读更容易:
,\s*{\s*"id":"440"[^}]*} |
{\s*"id":"440"[^}]*}\s*,|
{\s*"id":"440"[^}]*}
使用id循环JSON示例,在您的情况下,不需要使用unset()
使用id循环JSON示例,在您的情况下,不需要使用unset()
您是否介意尝试一下这个功能,看看它是否对您有用
<?php
// PASS IN THE ID YOU WANNA FILTER-OUT AS $id,
// 2ND PARAMETER IS THE JSON STRING
// 3RD PARAMETER IS THE REPLACEMENT STRING: IN YOUR CASE EMPTY: ""
function removeJsonBlock($id, $jsonSTR, $replacement="YEAH!!! IT WORKS!!!"){
$jsonSTR = trim($jsonSTR);
$filteredJson = preg_replace('#(\{\s*)([\'\"]id[\'\"]\:)(\s?[\'\"])' . trim($id) . '([\'\"])([\w,\.;\"\'\-\?\:\s_\n\r]+)(\},?)#si', $replacement, $jsonSTR);
return $filteredJson;
}
// THE JSON STRING IN QUESTION - REGARDLESS OF WHETHER DYNAMIC OR NOT.
$jsonSTR =<<<JSS
[
{
"id":"440",
"type":"prospect",
"fullname":"elizabeth cogelizabeth",
"phone":"01768413081",
"..." : ""
},
{
"id":"436",
"type":"prospect",
"fullname":"mandy cogmandy",
"phone":"01697349008",
"..." : ""
},
// ADD ANOTHER NODE WITH THE SAME ID OF 440 FOR EXAMPLE...
{
"id":"440",
"type":"prospect",
"fullname":"elizabeth cogelizabeth",
"phone":"01768413081",
"..." : ""
},
]
JSS;
// TEST THE SIMULATION... IT SHOULD REMOVE EVERY ENTRY WITH ID: 440
var_dump(removeJsonBlock(440, $jsonSTR));
//
您介意试试这个函数,看看它是否对您有用吗
<?php
// PASS IN THE ID YOU WANNA FILTER-OUT AS $id,
// 2ND PARAMETER IS THE JSON STRING
// 3RD PARAMETER IS THE REPLACEMENT STRING: IN YOUR CASE EMPTY: ""
function removeJsonBlock($id, $jsonSTR, $replacement="YEAH!!! IT WORKS!!!"){
$jsonSTR = trim($jsonSTR);
$filteredJson = preg_replace('#(\{\s*)([\'\"]id[\'\"]\:)(\s?[\'\"])' . trim($id) . '([\'\"])([\w,\.;\"\'\-\?\:\s_\n\r]+)(\},?)#si', $replacement, $jsonSTR);
return $filteredJson;
}
// THE JSON STRING IN QUESTION - REGARDLESS OF WHETHER DYNAMIC OR NOT.
$jsonSTR =<<<JSS
[
{
"id":"440",
"type":"prospect",
"fullname":"elizabeth cogelizabeth",
"phone":"01768413081",
"..." : ""
},
{
"id":"436",
"type":"prospect",
"fullname":"mandy cogmandy",
"phone":"01697349008",
"..." : ""
},
// ADD ANOTHER NODE WITH THE SAME ID OF 440 FOR EXAMPLE...
{
"id":"440",
"type":"prospect",
"fullname":"elizabeth cogelizabeth",
"phone":"01768413081",
"..." : ""
},
]
JSS;
// TEST THE SIMULATION... IT SHOULD REMOVE EVERY ENTRY WITH ID: 440
var_dump(removeJsonBlock(440, $jsonSTR));
//
不确定您的意思,您的示例没有导致,
失败的]
。我认为{\s*“id”:“440”、
或{\s*“id”:“\d+“,
更容易阅读。我认为在这里使用preg\u replace
不是一个好主意,通过json\u解码数组循环要好得多。将来我会给我的孩子取名为{bobby}”
只是为了摆脱像这样的懒惰代码。这里的问题还在于故障保护是如何实现的不仅仅是速度有多快,最好的是如果你同时拥有快速和故障保护@Julie Rokk有些人宁愿为了成长和进步而挑战自己。@Julie Rokk说得很清楚,引用:……因此,与其解码它,还不如在我想要的所有项目上循环,只需使用preg_替换……她已经知道她可以轻松解码、循环并完成,但仍然没有挑战,谁会成长?&如果不是为了发现新的、更好的(甚至是奇怪的),没有人会注册做事情的方法;因为一个人的知识总和相对于另一个人的加值可能只是一个字节:无私的帮助会有很长的路要走!*不确定你的意思,你的例子没有一个]
会导致,
失败。我认为{\s*“id”:“440”、
或{\s*“id”:“\d+“,
更容易阅读。我认为在这里使用preg\u replace
不是一个好主意,通过json\u解码数组循环要好得多。将来我会给我的孩子取名为{bobby}”
只是为了摆脱像这样的懒惰代码。这里的问题还在于故障保护是如何实现的不仅仅是速度有多快,最好的是如果你同时拥有快速和故障保护@Julie Rokk有些人宁愿为了成长和进步而挑战自己。@Julie Rokk说得很清楚,引用:……因此,与其解码它,还不如在我想要的所有项目上循环,只需使用preg_替换……她已经知道她可以轻松解码、循环并完成,但仍然没有挑战,谁会成长?&如果不是为了发现新的、更好的(甚至是奇怪的),没有人会注册做事情的方式;因为一个人的知识总和相对于另一个人的加值可能只是一个字节:1无私的帮助会有很长的路要走!*tnx,不幸的是,如果我选择json字符串中的最后一项导致无效的arraytnx,这不起作用,不幸的是,如果我选择js中的最后一项,这不起作用on字符串导致无效arraynice,但这不会删除导致无效arraynice的项之后或之前的逗号array@JulieRokk我添加了一个与逗号匹配的版本。很好,但这不会删除项目后面或之前的逗号,从而导致无效的array@JulieRokk我添加了一个与逗号匹配的版本。({\s*\“id\”:\“440\”[^}]*((\s*},)|(\s*}\s*)|(\s*}\s*}\s*]))|(\s*}\s*},)
,我不是正则表达式专家,但这可以做到:)如果您愿意,可以通过修改json的内部代码进一步测试它。即使元素是json中的最后一个(]
而不是,
),它也应该按id获取,或者尝试使用最后一个子元素,如“…”:{}
而不是”:“
({\s*\”id\:\“440\”[^}*)((\s*,)(\s*)(\s*}\s*)\s*)\s*);(\s*}\s*)\s*)\s*)\s*)
,我不是一个正则表达式专家,但这可以完成以下工作:)如果您愿意,可以通过修改json的内部代码来进一步测试它。即使元素是json中的最后一个(]
而不是,
),它也应该按id获取,或者尝试使用最后一个子元素,如“…”:{}
而不是“…”