Ruby - Récupérer toutes les expressions qui matchs

Expression Régulières - Ruby

a marqué ce sujet comme résolu.

Salut la planète,

J’ai un problème que je ne sais pas résoudre en Ruby. Je m’explique, je suis en train de créer un petit script qui sert à compter le nombre de balise html de chaque type dans un fichier donné en paramètre pour les afficher. Mon script ressemble à ceci :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# Usage Check
if $*.count != 1 then
    puts "Usage : #{$0} <html_file>"
    exit 1
end

# is it a file ?
if !File.file?($*[0]) then
    puts "Merci de spécifier un fichier html en paramètre."
    exit 2
end

file = $*[0]

File.open(file, 'r') do |file|
    file.each do |line|
        if line =~ /<(\w+)[^>]*>/ then
            puts $1.to_s, $2.to_s 
        end 
    end 
end

Le problème c’est que quand dans le fichier html il y a des lignes du genre :

1
2
<hr/><br>
<span> bla bla </span> <test></test>

Mon script ne me liste seulement ceci :

1
2
hr
span

alors que je souhaiterais qu’il affiche :

1
2
3
4
hr
br
span
test

Je ne parviens donc pas à résoudre ce problème qui devrait être pourtant simple..

Si vous pouvez apporter vos lumières ..

Merci :D

Salut,

Tu devrais plutôt utiliser la méthode scan qui retourne toutes les occurrences de ton expression dans la chaîne.

EDIT : un exemple.

1
2
str = "<hr/><br>\n<span> bla bla </span> <test></test>"
puts str.scan(/<(\w+)[^>]*>/)
+1 -0

Super, bonne continuation et bienvenue sur le site. :)

+1 -0

Sinon j’y avais pas trop fait attention mais :

  • tu peux utiliser ARGV à la place de $* ;
  • tu peux utiliser __FILE__ à la place de $0 (comme ça, tu n’auras pas toute l’arborescence mais juste le nom du fichier Ruby) ;
  • tu n’as pas besoin de parcourir le fichier ligne par ligne, tu peux faire puts File.open(ARGV[0]).read.scan(/<(\w+)[^>]*>/) (ou le faire en deux lignes pour plus de visibilité avec par exemple str = File.open(ARGV[0]).read et puts str.scan(/<(\w+)[^>]*>/) ;
  • plutôt que count, tu peux utiliser la méthode empty?.

EDIT : Et donc, une manière d’écrire ce script.

1
2
3
4
5
6
7
8
path = ARGV[0]
if path.nil? then
  puts "Usage : #{__FILE__} <html_file>"
elsif File.file?(path) && File.extname(path) == '.html' then
  puts File.read(path).scan(/<(\w+)[^>]*>/)
else
  puts "#{path} n’est pas valide. Merci de spécifier un fichier html en paramètre."
end
+1 -0

__FILE__ et $PROGRAM_NAME (l’équivalent de $0) n’ont pas le même intérêt.

Ici, dans le cas d’un usage, c’est justement $PROGRAM_NAME qui doit être utilisé. La ligne présentée dans le usage étant censée pouvoir être recopiée telle quelle dans le terminal pour exécuter le programme.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte