С регулярным выражением, как я могу сопоставить тег XML несколько раз?

Во-первых, прежде чем вы что-нибудь скажете, я ДОЛЖЕН сделать это, потому что RSS искажен, но я не могу исправить это со своей стороны. Итак, хотя я пытался использовать синтаксический анализатор RSS и XML, они терпят неудачу, и у меня есть только доступ к внешнему интерфейсу. Тем не менее, я очень близок, но я не могу понять, почему это не совпадет.

Фид (это длинная строка из 1 строки): http://pastebin.com/5dJhXCvf

Первый пример:

<title>(.+)</title>

Я подумал, что это отлично сработало с моим тестом только:

<title>&quot;cterrorism task force&quot; location:oregon - Google News</title>

Но проблема в том, что он соответствует всему, а затем одному совпадению, например:

<title>&quot;cterrorism task force&quot; location:oregon - Google News</title><title>&quot;cterrorism task force&quot; location:oregon - Google News</title>

Равняется 1 элементу результата в моем массиве из exec() и match()

Итак, я попытался:

<title>([\w\d\s\=\%\_\`\~\+\!\@\#\$\%\^\&\*\(\)\:\'\"\[\]\{\}\|\,\.\/]+)</title>

Но это ничего не возвращает... Есть идеи?


person Oscar Godson    schedule 03.12.2010    source источник
comment
Что неправильного в фиде?   -  person Anon.    schedule 03.12.2010
comment
Если вы скопируете и вставите это в валидатор W3C, это не удастся. И jQuery даже не попытается его разобрать. Я также пробовал jFeed, но это тоже не сработало. Однако, если я вызову его с текстовым ЗАГОЛОВКОМ, он вернется в порядке. Мне нужны только заголовок и ссылки, поэтому я решил, что могу просто разобрать текст, а затем использовать регулярное выражение.   -  person Oscar Godson    schedule 03.12.2010
comment
В вашем классе персонажей не хватает нескольких персонажей, что было совершенно неизбежно с таким монстром. Если вам нужен класс символов, который соответствует чему-либо, кроме угловых скобок, используйте это: [^<>]   -  person Alan Moore    schedule 03.12.2010
comment
Друзья не позволяют друзьям анализировать XML с помощью регулярных выражений.   -  person orangepips    schedule 03.12.2010
comment
@orangepips Я знаю, я знаю, но это буквально для мэра, и это XML, который он дает мне для использования.   -  person Oscar Godson    schedule 03.12.2010
comment
@Oscar Godson: Пожалуйста, проверьте @Laurence Gonsalves ответ. Похоже, у вас есть правильно сформированный XML-документ. Используйте XPath или любой другой стандартный XML-инструмент.   -  person    schedule 04.12.2010
comment
См. мой комментарий к Марку Томасу ниже.   -  person Oscar Godson    schedule 04.12.2010


Ответы (5)


Попробуйте нежадную версию <title>(.+?)<\/title>. Здесь вы можете проверить это в Интернете.

person detunized    schedule 03.12.2010
comment
/<title>(.+?)<\/title>/g отлично, но возвращает только 2 результата. Вы знаете, почему это было бы? Думаю, должно быть 9... - person Oscar Godson; 03.12.2010
comment
Не уверена. Есть ли в вашем тексте новые строки? - person detunized; 03.12.2010
comment
Не должно быть... но может быть - person Oscar Godson; 03.12.2010
comment
Возможно, он неправильно обрабатывает \n. В данный момент у меня нет других идей. Попробуйте добавить флаги m и/или i. - person detunized; 03.12.2010
comment
@Оскар попробуй <title>([^<]+?)</title> - person Mike Clark; 03.12.2010
comment
@Oscar: это отлично работает в EditPadPro; Я получаю девять ударов. Модификаторы m и i не должны ничего делать: регулярное выражение не содержит якорей, а имена тегов всегда в нижнем регистре. - person Alan Moore; 03.12.2010

Размещенный вами RSS является правильно сформированным XML, но недействительным RSS (согласно валидатору канала W3C). Поскольку он правильно сформирован, лучше всего использовать синтаксический анализатор XML, а не регулярное выражение. На самом деле, большинство синтаксических анализаторов RSS также должны быть в порядке, поскольку RSS печально известен своими проблемами проверки (отчасти из-за плохих спецификаций на раннем этапе), поэтому любой синтаксический анализатор RSS, который стоит использовать, не должен иметь никаких проблем с проблемами проверки. Валидатор W3C сообщает.

Кроме того, это похоже на ленту новостей Google. Вы можете получить действительный Atom, изменив выходной параметр с «rss» на «atom». например:

http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=h&num=3&output=atom

Службы Google, которые генерируют каналы, обычно лучше справляются с созданием Atom, а не RSS. Тем не менее, вы также можете сообщить о недействительном RSS в Google.

person Laurence Gonsalves    schedule 03.12.2010

Попробуйте ленивый квантификатор:

<title>([^<]+?)</title>
person Mike Clark    schedule 03.12.2010

Попробуйте нежадное выражение, добавив флаг U:

"/<title>(.+)</title>/U"

Это говорит ему сопоставлять наименьшее совпадение, а не наибольшее доступное совпадение.

person Hamish    schedule 03.12.2010

Многие парсеры могут обрабатывать небольшие отклонения от спецификаций. Любая привязка к превосходной библиотеке libxml2 сможет обрабатывать плохо сформированный XML. Есть привязки на многих языках. Например, следующий фрагмент кода Ruby прекрасно его анализирует:

require 'nokogiri'

xml = open('rss.txt').read
doc = Nokogiri::XML.parse(xml)
doc.xpath('//title').each do |title|
  puts title.inner_text
end

Результат:

"joint terrorism task force" location:oregon - Google News
"joint terrorism task force" location:oregon - Google News
Federal and FBI Joint Terrorism Task Force are still flawed - OregonLive.com
Striking a fair balance - OregonLive.com
Blame the terrorists, not the FBI - Portland Tribune
Why Oregon? Why not?: Terrorism can strike anywhere - The Register-Guard
INDIVIDUAL TRAVEL UNDER ATTACK - NewsWithViews.com
The other terrorism-and pondering Portland - BlueOregon
Fla. dance troupe causes scare at Lincoln Tunnel - Northwest Cable News

Изменить: на основании ваших комментариев я вижу, что вы используете jQuery. Вы должны иметь возможность использовать синтаксический анализатор XML jQuery для извлечения заголовков (и других частей, если это необходимо).

person Mark Thomas    schedule 03.12.2010
comment
Синтаксический анализатор jQuery XML автоматически завершается ошибкой. При анализе как XML я получаю возврат XML в веб-инспекторе, но фактическое возвращаемое значение равно null. Если я попрошу это в необработанном тексте, он вернется в порядке. Вот почему я был регулярным выражением. - person Oscar Godson; 04.12.2010