2010-10-30 21 views
0

Je pense que j'ai besoin d'un combo de hpricot et regex ici. Je dois rechercher des balises 'a' avec un attribut 'href' qui commence par 'abc /', et renvoie le texte suivant jusqu'à la barre oblique suivante '/'.Obtenir une partie de l'attribut href en utilisant hpricot

Ainsi, étant donné:

<a href="/abc/12345/xyz123/">One</a> 
<a href="/abc/67890/xyzabc/">Two</a> 

Je dois retourner: '12345' et '67890'

Quelqu'un peut-il donner un coup de main? J'ai lutté avec ça.

+1

slash « Forward » ?? – tchrist

+0

Qu'en est-il de scinder la chaîne? –

Répondre

0

Vous n'avez pas besoin, mais regex vous pouvez l'utiliser. Voici deux exemples, l'un avec regex et l'autre sans, en utilisant Nokogiri, qui devrait être compatible avec hpricot pour votre utilisation, et utilise CSS accesseurs:

require 'nokogiri' 

html = %q[ 
    <a href="/abc/12345/xyz123/">One</a> 
    <a href="/abc/67890/xyzabc/">Two</a> 
] 

doc = Nokogiri::HTML(html) 
doc.css('a[@href]').map{ |h| h['href'][/(\d+)/, 1] } # => ["12345", "67890"] 
doc.css('a[@href]').map{ |h| h['href'].split('/')[2] } # => ["12345", "67890"] 
0

Qu'en est-il de scinder la chaîne par /?

(Je ne sais pas hpricot, mais selon les docs):

doc.search("a[@href]").each do |a| 
    return a.somemethodtogettheattribute("href").split("/")[2]; // 2, because the string starts with '/' 
end 
0

ou utiliser regex:

s = '<a href="/abc/12345/xyz123/">One</a>' 
s =~ /abc\/([^\/]*)/ 
return $1 
+0

'One' –

+0

de = ~/href = "\/abc \/([^ \ /] *)/ – vurte

+0

href = '/ abc/12345/spacesandsinglequotesandtabsandnewlines' –