Come far esplodere
tag in una stringa?
Domanda
Ho una stringa con il mazzo di tag di interruzione.
purtroppo sono irregolari.
<Br> <BR> <br/> <BR/> <br />
ecc ...
Sto usando nokogiri, ma non so come dire che per spezzare la stringa in ogni tag rottura ....
Grazie.
Soluzione
Quindi, per implementare la risposta di iftrue:
a = 'a<Br>b<BR>c<br/>d<BR/>e<br />f'
a.split(/<\s*[Bb][Rr]\s*\/*>/)
=> ["a", "b", "c", "d", "e", "f"]
... si è lasciato con un allineamento dei bit della stringa tra le pause HTML.
Altri suggerimenti
Se si riesce a rompere sulle espressioni regolari, utilizzare il seguente delimitatore:
<\s*[Bb][Rr]\s*\/*>
Spiegazione:
Per una parentesi angolare sinistra, zero o più spazi, B o B, R o R, zero o più spazi, zero o più barre dirette.
Per usare l'espressione regolare, guarda qui:
http://www.regular-expressions.info/ruby.html
del Pesto 99% del tragitto, però Nokogiri supporta la creazione di un frammento di documento che non va a capo il testo nella dichiarazione:
text = Nokogiri::HTML::DocumentFragment.parse('<Br>this<BR>is<br/>a<BR/>text<br />string').children.select {|n| n.text? and n.content }
puts text
# >> this
# >> is
# >> a
# >> text
# >> string
Se si analizza la stringa con Nokogiri, si può quindi eseguire la scansione attraverso di essa e ignorare qualcosa di diverso da elementi di testo:
require 'nokogiri'
doc = Nokogiri::HTML.parse('a<Br>b<BR>c<br/>d<BR/>e<br />f')
text = []
doc.search('p').first.children.each do |node|
text << node.content if node.text?
end
p text # => ["a", "b", "c", "d", "e", "f"]
Si noti che si deve cercare il primo tag p perché Nokogiri sarà avvolgere il tutto in <!DOCTYPE blah blah><html><body><p>YOUR TEXT</p></body></html>
.