Возврат объекта javascript из строки с использованием Regex или альтернативных методов. - PullRequest
1 голос
/ 23 марта 2020

У меня есть функция в Javascript для сопоставления текста между фигурными скобками (включая фигурные скобки) для извлечения строки JSON из разных постов. Ниже приведена функция:

function eventObject(value) {
   var json = text.match(/{([^}]+)}/)[0]; // matches content between curly braces
   return json;
}

Ввод выглядит следующим образом:

{ 
 "host": "Host link..",
 "info": "Info text...",
 "links": [ {"title": "link_title", "url": "link_url"}, {"title": "link_title_2", "url": "link_url_2"} ],
 "category": "campfire"
}

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


Обновление

Я понял, что упустил некоторую важную информацию, чтобы упростить мой вопрос: ответ API - это строка raw html, которая содержит строку Я хотел бы разобрать как объект. Типичное значение HTML выглядит следующим образом:

"cooked":"<pre><code class=\"lang-auto\">{\n\"host\": \"host_link\",\n\"info\": \"event_info\",\n\"links\": [{\"title\": \"link_title \", \"url\": \"link_url"},{\"title\": \"link_two_title \", \"url\": \"link_two_url\"} ],\n\"category\": \"category\"\n}\n
"}

Задача состоит в извлечении всей строки между <code> и разборе ее в объект. У меня есть обновил заголовок вопроса, чтобы отразить это.

Следующая функция успешно извлекает строку и удаляет теги html и разрывы строк, но неправильно обрабатывает ее как объект:

function eventObject(value){

  const doc = new DOMParser().parseFromString(value, "text/html");
  var json = [...doc.querySelectorAll('code')].map(code => code.textContent); // DOMParser extracts text between <code> tags
  var final = String(json).replace(/\n/g, " ").replace(/[\u2018\u2019]/g, "'").replace(/[\u201C\u201D]/g, '"'); // removes line breaks and replaces curly quotes with straight quotes
  var string = JSON.stringify(final);
  var obj = JSON.parse("'" + string + "'");
  return obj;

}

1 Ответ

1 голос
/ 23 марта 2020

Ваша функция eventObject выглядит нормально, но вам не нужно JSON.stringify, потому что она предназначена для сериализации JavaScript объектов, тогда как вы передаете ей строку. Попробуйте это:

function eventObject(value){

  const doc = new DOMParser().parseFromString(value, "text/html");
  var json = [...doc.querySelectorAll('code')].map(code => code.textContent); // DOMParser extracts text between <code> tags
  var final = String(json).replace(/\n/g, " ").replace(/[\u2018\u2019]/g, "'").replace(/[\u201C\u201D]/g, '"'); // removes line breaks and replaces curly quotes with straight quotes
  // var string = JSON.stringify(final);
  var obj = JSON.parse(final);
  return obj;

}

var value = '"cooked":"<pre><code class=\"lang-auto\">{\n\"host\": \"host_link\",\n\"info\": \"event_info\",\n\"links\": [{\"title\": \"link_title \", \"url\": \"link_url"},{\"title\": \"link_two_title \", \"url\": \"link_two_url\"} ],\n\"category\": \"category\"\n}\n
"} '; console.log (eventObject (значение))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...