2011-01-17 5 views
1

У меня есть этот HTML-код, который находится на одной линии:Проблема с Руби Regular Expression

<h3 class='r'><a href="www.google.com">fkdsafjldsajl</a></h3><h3 class='r'><a href="www.google.com">fkdsafjldsajl</a></h3> 

Вот строка для печати (что я не могу использовать)

<h3 class='r'><a href="www.google.com">fkdsafjldsajl</a></h3> 
<h3 class='r'><a href="www.google.com">fkdsafjldsajl</a></h3> 

И я пытаюсь извлечь только URL-адреса, с этим REGEX

/<h3 class="r"><a href="(.*)">(.*)<\/a>/ 

И это возвращает

www.google.com">fkdsafjldsajl</a></h3><h3 class='r'><a href="www.google.com" 

Что я могу сделать, чтобы остановить его, когда вы найдете "?

+0

Будьте осторожны, пытаясь разобрать HTML с помощью регулярного выражения. Даже в простом HTML вы можете запустить URL-адрес, который испортил ваше регулярное выражение. –

ответ

3

Вздох. Regex и HTML такие неудобные Bedfellows:

require 'nokogiri' 

html = %q{<h3 class='r'><a href="www.google.com">fkdsafjldsajl</a></h3><h3 class='r'><a href="www.google.com">fkdsafjldsajl</a></h3>} 
doc = Nokogiri::HTML(html) 
puts doc.css('a').map{ |a| a['href'] } 
# >> www.google.com 
# >> www.google.com 

Это их найти, являются ли они глубоко вложенным или все в одной строке.

3

Проблема в том, что * является жадным. Поместите знак вопроса после него, чтобы сделать его неровным.

Работа регулярных выражений (проверено на rubular)

href\=\"(.*?)\" 
+0

Даже '(. *?)' 'Может есть' ''. Лучше использовать '[^"] + "'. – Nakilon

+1

Я не знаю, может ли случай использования OPs столкнуться с href, заключенным в одиночные кавычки, но, поскольку они являются законными в HTML, предлагаемая модель, вероятно, должна их обрабатывать. И, поскольку в большом количестве HTML отсутствуют двойные и одинарные кавычки, возможно, это тоже нужно обработать. Кроме того, согласно второму и последнему абзацу раздела 2.2 URL [spec] (http://www.apps.ietf.org/rfc/rfc1738.html#sec-2.2), '' 'и' '' являются законным в URL-адресе, поэтому он, вероятно, должен справиться с ними. –