I have this data:
{"names":["George","Eric","Alice"]}
And I want to use preg_match_all
to filter out the words in between quotation like this:
$s = $data;
if (preg_match_all('/"([^:]*)"/', $s, $matches)) {
echo join("
", $matches[1]);
}
But this is outputting names George","Eric","Alice
I tried many things but I cant figure it out.
*
matches greedy (as much as possible). Use non-greey version: *?
if (preg_match_all('/"([^:]*?)"/', $s, $matches)) {
echo join("
", $matches[1]);
}
output:
names
George
Eric
Alice
UPDATE
json_decode
is more appropriate for this kind of work. Try following:
foreach (json_decode($s, true) as $key => $value) {
echo $key . "
";
echo join("
", $value);
}
This is actually JSON string use json_decode
to parse it rather than using regex on this:
print_r(json_decode('{"names":["George","Eric","Alice"]}', true));
OUTPUT:
Array
(
[names] => Array
(
[0] => George
[1] => Eric
[2] => Alice
)
)
try this
$strContent = '{"names":["George","Eric","Alice"]}';
$strRegex = '%\"(.+?)\"%s';
if (preg_match_all($strRegex, $strContent, $arrMatches))
{
var_dump($arrMatches[1]);
}
Since your data is json formatted you should really treat is as json and not process it with regex which is to be used for strings. Try this:
$json = '{"names":["George","Eric","Alice"]}';
$data = json_decode($json, true);
foreach($data['names'] as $item) echo "$item
";
Or without the hard coded "names":
$json = '{"names":["George","Eric","Alice"]}';
$data = json_decode($json, true);
foreach($data as $arr) foreach($arr as $item) echo "$item
";