С помощью регулярных выражений, как я могу сопоставить тег XML несколько раз? - PullRequest
1 голос
/ 03 декабря 2010

Во-первых, прежде чем что-то сказать, я ДОЛЖЕН сделать это, потому что 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>

Но это ничего не возвращает ... Любойидеи?

Ответы [ 5 ]

6 голосов
/ 03 декабря 2010

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

2 голосов
/ 03 декабря 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.

1 голос
/ 03 декабря 2010

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

<title>([^<]+?)</title>
0 голосов
/ 03 декабря 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 для извлечения заголовков (и других частей, если необходимо).

0 голосов
/ 03 декабря 2010

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

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

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

...