4

我正在尝试使用 PHP 在字符串中查找 JSON 字符串。

因此,如果一个字符串完全是 JSON,PHP 可以像这样解析它:

<?php
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($json, true));

?>

但是如果我有一个像这样的字符串怎么办

$str = 'I have a string that contains JSON like this : {"a":1,"b":2,"c":3,"d":4,"e":5} and then string continues';

如何从中解析 JSON?

谢谢 !

编辑:

感谢您的所有回答。他们真的帮助了我。我应该补充一点,就我而言,字符串将采用以下形式:

$str = 'some string and some more string [[delimiter]] json={"a":1,"b":2}';

而且,我不是反对者:)

4

3 回答 3

2

您将需要一个严肃的正则表达式,例如此处的那个,我对其进行了非常细微的更改以匹配为子字符串:

$str = 'I have a string [123,456] that contains JSON like this : {"a":1,"b":2,"c":3,"d":4,"e":5} and then string continues';

$pcre_regex = '
  /
  (?(DEFINE)
     (?<number>   -? (?= [1-9]|0(?!\d) ) \d+ (\.\d+)? ([eE] [+-]? \d+)? )
     (?<boolean>   true | false | null )
     (?<string>    " ([^"\\\\]* | \\\\ ["\\\\bfnrt\/] | \\\\ u [0-9a-f]{4} )* " )
     (?<array>     \[  (?:  (?&json)  (?: , (?&json)  )*  )?  \s* \] )
     (?<pair>      \s* (?&string) \s* : (?&json)  )
     (?<object>    \{  (?:  (?&pair)  (?: , (?&pair)  )*  )?  \s* \} )
     (?<json>   \s* (?: (?&number) | (?&boolean) | (?&string) | (?&array) | (?&object) ) \s* )
  )
  (?&json)
  /six
';

if (preg_match_all($pcre_regex, $str, $matches)) {
    print_r($matches[0]);
}

回报:

Array
(
    [0] =>  [123,456] 
    [1] =>  {"a":1,"b":2,"c":3,"d":4,"e":5} 
)

更新

您可以在表达式中添加锚点进行匹配,例如:

json=(?<expr>(?&json))\Z
于 2013-07-12T14:58:18.313 回答
1

您应该围绕放入字符串的 JSON 创建自己的特殊分隔符。如果你真的不能这样做,你可以尝试在 '{"' 和 '}' 我想,但如果它们在你的字符串中的其他地方它将不起作用。你可以使用这个自定义函数来做到这一点:

function get_string_between($string, $start, $end){
    $string = " ".$string;
    $ini = strpos($string,$start);
    if ($ini == 0) return "";
    $ini += strlen($start);
    $len = strpos($string,$end,$ini) - $ini;
    return substr($string,$ini,$len);
}

$fullstring = 'I have a string that contains JSON like this : {"a":1,"b":2,"c":3,"d":4,"e":5} and then string continues';
$parsed = get_string_between($fullstring, '{"', '}';

echo $parsed;
于 2013-07-12T14:39:54.053 回答
0
preg_match('/(\{.+\})/', $str, $result);
echo $result[0];

如果字符串的其余部分不包含花括号,则应该这样做。

于 2013-07-12T14:38:45.063 回答