2016-07-25 10 views
-1

У меня есть строка смешанного содержимого, что-то вроде:Извлечение JSON из смешанного содержимого строки

{JSON вещей} другого содержимого же выхода имеет < теги HTML> как < div> некоторого </div> и больше вещей, в конце концов, это имеет другой {} материал JSON

Так что мне нужно, чтобы иметь возможность использовать эти 3 элемента:
Таким образом, чтобы получить первый JSON я это сделать:

$first_json = json_decode(substr($mixed_string,0, strpos($mixed_string,"}")+1)); 
// that will get me the first json content 
// Then I need the second json which is at the end of the string, 
// the length of the string is unknown , the json length is unknown 
// after that I just do: 
echo preg_replace("/\{[^)]+\}/","",$mixed_string); 
// and I get the html from that string... 

Итак, как я могу получить последний json?

+0

использование 'strrpos' найти последний' '{в строке, то SubStr оттуда до конца? –

+0

@MarcB Не будет работать на '{" a ":" b "} {" a ": {" b ":" c "}}'. – Siguza

+1

@ Сигуза: конечно, нет, что делает правильный ответ «исправить все, что выплевывает этот мусор, чтобы он выводил PROPER json». –

ответ

0

Вы можете использовать регулярное выражение для захвата значений JSON, и это позволит вам захватить JSON из любой строки, независимо от ее длины. Скажем, у вас есть div с идентификатором контента, и что div имеет JSON вы хотите извлечь:

EDIT: Добавлена ​​процесс экстракции в качестве функции.

function extractJSON(content) { 
 
    var regex = /({.*?})/g, 
 
    raw = content.match(regex), 
 
    output = [], 
 
    errors = []; 
 

 
    raw.forEach(function(el) { 
 
    try { 
 
     output.push(JSON.parse(el)); 
 
    } catch (e) { 
 
     errors.push('issue with object: ' + el); 
 
    } 
 
    }); 
 

 
    return { 
 
    results: output, 
 
    errors: errors 
 
    } 
 
} 
 

 
// Grab the elements that contain JSON 
 
var elements = document.getElementById('content').innerHTML; 
 

 
console.log(extractJSON(elements));