zelo
May 15, 2009, 12:15pm
1
Bonjour à tous
Je travail actuellement sur une application ror et j’ai un petit souci
j’ai une variable qui contient le code html de ma page et je souhaiterai
récupérer ce qu’il se trouve entre et
J’ai donc voulu utiliser une regex :
BODY_PATTERN = /<body.*</body>/m
…
h = BODY_PATTERN.match(h)[0]
me renvoi une erreur undefined method `[]’ for nil:NilClass
pourtant en affichant h juste avant, j’ai bien un et
PS: J’ai l’impression que ceci fonctionnerai si tout le code html était
sur une seul ligne car j’ai lu sur un autre forum et avec un autre
langage que le caractère saut de ligne n’est pas reconnu dans “.”
Avez vous une idée pour résoudre ce problème ?
zelo
May 16, 2009, 6:34pm
2
2009/5/15 Ze lo [email protected]
me renvoi une erreur undefined method `[]’ for nil:NilClass
pourtant en affichant h juste avant, j’ai bien un et
PS: J’ai l’impression que ceci fonctionnerai si tout le code html était
sur une seul ligne car j’ai lu sur un autre forum et avec un autre
langage que le caractère saut de ligne n’est pas reconnu dans “.”
Oui, ton impression est correct. Tu a besoin de multiple-ligne regexen,
et u
utilise /m aussi. Ça c’est bien et ça marche pour moi.
J’avais mis les la parenthèses ici et j’avais changé l’index. ([0] est
le
resultat complet: class MatchData - RDoc Documentation
body = “test \nheh”
BODY_PATTERN = /(.*)</body>/m
puts BODY_PATTERN.match(body)[1]
Output:
1
2
test
heh
Essayez de changer cela avec vos données réelles.
http://codepad.org/6UsVTgZO
zelo
May 18, 2009, 10:26am
3
Merci de ta réponse
Je reste néanmoins coincé. J’ai donc afficher ma variable avant le
match:
BODY_PATTERN = /(.*)</body>/m
h = IO.readlines(self.path_to_tmp_diff_html).join if h.nil?
puts ‘===============debut=============’
puts h
puts ‘=======================fin ============’
h = BODY_PATTERN.match(h)[0]
et l’affichage résumé de h :
===============debut=============
bienvenue
=======================fin ============
===============debut=============
bienvenue
=======================fin ============
comme tu peux le voir le deuxième affichage ne contient pas de body (ni
de html) mais le premier si. Est ce problématique ?
zelo
May 18, 2009, 11:55pm
4
Je pensais que vous vouliez vous débarrasser de . Modifier ce
pastie
et le renvoyer ici.
http://codepad.org/APExUC7Y
Avec body: BODY_PATTERN.match(body)[0]
Sans body: BODY_PATTERN.match(body)[1]
2009/5/18 Ze lo [email protected]
zelo
May 19, 2009, 11:03am
5
Constantin G. wrote:
Je pensais que vous vouliez vous débarrasser de . Modifier ce
pastie
et le renvoyer ici.
http://codepad.org/APExUC7Y
Avec body: BODY_PATTERN.match(body)[0]
Sans body: BODY_PATTERN.match(body)[1]
2009/5/18 Ze lo [email protected]
Oui en effet, vous aviez bien compris ce que je voulais.
C’est moi qui est mal compris la réponse. Pour supprimer le
j’utilisais gsub (ignorant que [1]faisait très bien l’affaire)
Pour en revenir à mon problème, je pense qu’il faut faire 2 cas :
si le code html contient les balises et
si le code html ne contient ces balises
J’ai beau essayer mais je n’y arrive pas .
Voici le code que j’ai essayé
PATTERN = /</head>.
(\n) <script/m
BODY_PATTERN = /<body.*</body>/m
if (BODY_PATTERN.match(h) == nil)
h = PATTERN.match(h)[1]
puts ‘===========test 2’
puts h
else
h = BODY_PATTERN.match(h)[0]
en sachant que lorsque le code html ne contient pas les balises
et , il ressemble à ça :
bienvenue
je souhaite récupérer tout ce qu’il y a entre et
. (en
excluant ces balises)
Mais mon pattern ne semble pas matché
Merci pour votre aide
zelo
May 20, 2009, 12:07pm
6
Bonjour à tous
Je pense avoir quasiment résolu mon problème
Il me faudrait juste pouvoir retirer la dernière occurrence d’une chaine
Je m’explique imaginons chaine = “
coucou
coucou2
”
je voudrais avoir au final chaine =“
coucou
coucou2
”
donc retirer le dernier
Peut être une option à ajouter à sub ?