Поиск строк JSON в строке


Я ищу способ найти данные JSON в строке. Подумайте об этом, как о шорткодах wordpress. Я полагаю, что лучшим способом сделать это было бы регулярное выражение. Я не хочу анализировать JSON, просто найдите все случаи.

Есть ли способ в регулярном выражении иметь совпадающие числа скобок? В настоящее время я сталкиваюсь с этой проблемой при наличии вложенных объектов.

Краткий пример для демонстрации:

This is a funny text about stuff,
look at this product {"action":"product","options":{...}}.
More Text is to come and another JSON string
{"action":"review","options":{...}}

В результате я хотел бы иметь два JSON струнные. Спасибо!

Author: rootman, 2014-02-24

1 answers

Извлечение строки JSON из заданного текста

Поскольку вы ищете упрощенное решение, вы можете использовать следующее регулярное выражение, которое использует рекурсию для решения проблемы соответствия набора скобок. Он рекурсивно сопоставляет все между { и }.

Хотя следует отметить, что это не гарантирует работу со всеми возможными случаями. Это служит только для быстрого извлечения строки JSON метод.

$pattern = '
/
\{              # { character
    (?:         # non-capturing group
        [^{}]   # anything that is not a { or }
        |       # OR
        (?R)    # recurses the entire pattern
    )*          # previous group zero or more times
\}              # } character
/x
';

preg_match_all($pattern, $text, $matches);
print_r($matches[0]);

Вывод:

Array
(
    [0] => {"action":"product","options":{...}}
    [1] => {"action":"review","options":{...}}
)

Демонстрация регулярного выражения 101


Проверка строк JSON

В PHP единственный способ узнать, допустима ли строка JSON, - это применить json_decode(). Если анализатор понимает JSON-строку и соответствует определенным стандартам, json_decode() создаст представление объекта/массива JSON-строки.

Если вы хотите отфильтровать те, которые не являются допустимыми JSON, то вы можете использовать array_filter() с помощью функция обратного вызова:

function isValidJSON($string) {
    json_decode($string);
    return (json_last_error() == JSON_ERROR_NONE);
}

$valid_jsons_arr = array_filter($matches[0], 'isValidJSON');

Онлайн-демонстрация

 36
Author: Amal Murali, 2014-02-24 18:01:30