Problème regex et saut de ligne


#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 ?


#2

2009/5/15 Ze lo removed_email_address@domain.invalid

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: http://www.ruby-doc.org/core/classes/MatchData.html

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


#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 ?


#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 removed_email_address@domain.invalid


#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 removed_email_address@domain.invalid

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


#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 ?