Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.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 preg_替换json字符串化对象_Php_Json_Object_Preg Replace_Stringify - Fatal编程技术网

PHP preg_替换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",

我有一个我自己无法解决的正则表达式挑战,我有一个json字符串化文件,其中包含大量条目,因此,我不需要解码它并在所有项目上循环,只需使用
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获取,或者尝试使用最后一个子元素,如
“…”:{}
而不是
“…”