2009-09-02 12 views
2

Je veux nettoyer une page HTML de ses étiquettes, en utilisant Ruby. J'ai le code HTML brut, et je voudrais définir une liste d'étiquettes, par ex. [ « Durée », « li », « div »], et créer un tableau d'expressions régulières que je pouvais courir de manière séquentielle, de sorte que jeRuby liste d'étiquettes à une expression régulière

clean_text = raw.gsub(first_regex,' ').gsub(second_regex,' ')... 

avec deux expressions régulières par étiquette (début et fin) . Est-ce que j'ai un moyen de faire cela par programme (c'est-à-dire pré-compiler le tableau regex à partir d'un tableau de tags, puis les exécuter dans un modèle fluide)? EDIT: Je me rends compte que j'ai effectivement posé deux questions à la fois - La première sur la transformation d'une liste de balises en une liste d'expressions régulières, et la seconde sur l'appel d'une liste d'expressions régulières en tant que couramment. Merci d'avoir répondu aux deux questions. Je vais essayer de faire mes prochaines questions à thème unique.

+3

avez-vous pensé à utiliser un analyseur xml/html approprié (par exemple nokogiri http://nokogiri.org/)? –

+0

Eh bien, un analyseur xml/html approprié est une solution plus robuste, mais je veux "juste le texte", prêt à tolérer un résultat un peu bruyant en retour pour ne pas avoir à cartographier la structure exacte du document. –

Répondre

2

Cela devrait produire une seule expression rationnelle pour supprimer toutes vos balises.

clean_text = raw.gsub(/<\/?(#{tags.join("|")})>/, '') 

Cependant, vous devez l'améliorer pour soutenir les balises avec des attributs (par exemple < a href = "..." >), actuellement sont supprimés uniquement des balises simples (par exemple un < >)

+1

cela l'améliorera naïvement: /<\/?(#{tags.join("|")})[^>]*>/ - va se casser si n'importe quelle valeur d'attribut contient un '>' –

1

En supposant que vous avez une méthode build_regex pour transformer une étiquette en une expression régulière, cela devrait le faire:

tags = %w(span div li) 
clean_text = tags.inject(raw) {|text, tag| text.gsub build_regex(tag), ' ' } 

L'appel inject passe le résultat de chaque substitution dans la prochaine itération du bloc, donnant l'effet de courir chaque gsub sur la chaîne un par un.