Получение текста в кавычках

Есть данные вида: {'id': '3', 'answer': '1'},{'id': '4', 'answer': 'здесь ответ на вопрос, 12345 abc'},{'id': '4', 'answer': '123'}. Нужно получить текст в кавычках после " 'answer': ", в регулярки могу не особо, получилось что-то вроде /'answer':.['](\W+[a-zA-Z0-9_]\S+\s\w+)|:.'(\w+)[']}/, с таким выражением бывает что не выдергивается значение целиком (если после 12345 abc добавить еще один пробел регулярка уже ломается), или вообще ничего не выдергивается. Подскажите пожалуйста как правильно составить регулярку для этого.


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

Сначала нужно конвертировать вашу строку в валидный JSON. Сначала преобразуем одиночные кавчки в двойные.

Это можно сделать с помощью следующей функции:

function fixJSON($json) {
    $regex = <<<'REGEX'
~
    "[^"\\]*(?:\\.|[^"\\]*)*"
    (*SKIP)(*F)
  | '([^'\\]*(?:\\.|[^'\\]*)*)'
~x
REGEX;

    return preg_replace_callback($regex, function($matches) {
        return '"' . preg_replace('~\\\\.(*SKIP)(*F)|"~', '\\"', $matches[1]) . '"';
    }, $json);
}

Чтобы строка распарсилась как надо, после преобразования заключим строку в квадратные скобки и используем функцию json_decode:

$json = "{'id': '3', 'answer': '1'},{'id': '4', 'answer': 'здесь ответ на вопрос, 12345 abc'},{'id': '4', 'answer': '123'}";   // Задаём нашу строку
$obj = json_decode(fixJSON("[$json]"));  // Получаем объект JSON

Далее остаётся пройтись по всем элементам и получить значения в ключах со значением answer:

foreach ($obj as $key=>$val) {
  echo "$val->answer\n";
}
// => 1   
// => здесь ответ на вопрос, 12345 abc
// => 123

См. пример работы кода на PHP.

→ Ссылка