Regex to Parse XML - RSS Feed - PullRequest
       64

Regex to Parse XML - RSS Feed

0 голосов
/ 23 марта 2020
<atom:link rel="self" href="http://www.independent.co.uk/"/>
<item>
<title>
Coronavirus: Why the Covid-19 economic stimulus deal will make it to Trump&apos;s desk
</title>
<link>
https://www.independent.co.uk/news/world/americas/us-politics/coronavirus-economic-stimulus-deal-covid-19-trump-bill-senate-house-a9419976.html
</link>
<description>
<![CDATA[
News Analysis: When Senate tries to pass major bills, there's always one day of chaos. Monday appears to be that day.
]]>
</description>

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

Конечная цель - выгрузить извлеченный контент в предопределенный sql дБ, которые я создал

1 Ответ

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

Как указано в комментариях, скорее всего, вам следует использовать XML синтаксический анализатор, а не регулярное выражение, но, поскольку формат RSS-канала, вероятно, согласован и довольно прост, решение для регулярных выражений тоже может работать.

Для текущий пример, который вы можете использовать:

<(.+)>\s*(?:<!\[CDATA\[)?\s*(.*)\s*(?:]]>)?\s*<\/\1>

Объяснение:

  • <(.+)> - соответствует открывающему тегу, захватывает имя
  • \s* - соответствует необязательно пробельные символы (новая строка в вашем примере)
  • (?:<!\[CDATA\[)? - группа без захвата для <![CDATA[, соответствует 0 или 1 раз
  • \s* - соответствует необязательным пробельным символам
  • (.*) - группа захвата, которая будет перехватывать любые символы
  • \s* - соответствует необязательным пробельным символам
  • (?:]]>)? - группа без захвата для ]]> (закрытие CDATA) , соответствует 0 или 1 раз
  • \s* - сопоставляет необязательные пробельные символы
  • <\/\1> - сопоставляет закрывающий тег с тем же именем, что и открывающий тег (обратная ссылка на 1-ю группу захвата)

let input = `<title>
Coronavirus: Why the Covid-19 economic stimulus deal will make it to Trump&apos;s desk
</title>
<link>
https://www.independent.co.uk/news/world/americas/us-politics/coronavirus-economic-stimulus-deal-covid-19-trump-bill-senate-house-a9419976.html
</link>
<description>
<![CDATA[
News Analysis: When Senate tries to pass major bills, there's always one day of chaos. Monday appears to be that day.
]]>
</description>`;

let regex = /<(.+)>\s*(?:<!\[CDATA\[)?\s*(.*)\s*(?:]]>)?\s*<\/\1>/g;

let result;
do {
  result = regex.exec(input);
  if (result) {
    console.log(result[1] + ": " + result[2]);
  }
} while (result);
...