Forum: Rails France Problème regex et saut de ligne

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Ze l. (Guest)
on 2009-05-15 14:15
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 <body> et </body>
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 <body> et </body>
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 ?
Constantin G. (Guest)
on 2009-05-16 20:34
(Received via mailing list)
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 <body> et </body>
> 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 = "<body>test \nheh</body>"
BODY_PATTERN = /<body>(.*)<\/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
Ze l. (Guest)
on 2009-05-18 12:26
Merci de ta réponse
Je reste néanmoins coincé. J'ai donc afficher ma variable avant le
match:
BODY_PATTERN = /<body>(.*)<\/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=============
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitiona...
<html lang="fr" xml:lang="fr"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>bienvenue</title>
<meta name="uma.type" content="SupportingMaterial">
<meta name="uma.name" content="bienvenue">
<meta name="uma.presentationName" content="bienvenue">
<meta name="element_type" content="other">
<meta name="filetype" content="description">
<meta name="role" content="">
</head>
<body>
<div id="breadcrumbs"></div>
<!-- du texte html -->
</body>
</html>
=======================fin ============
===============debut=============
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>bienvenue</title>
<meta name="uma.type" content="SupportingMaterial">
<meta name="uma.name" content="bienvenue">
<meta name="uma.presentationName" content="bienvenue">
<meta name="element_type" content="other">
<meta name="filetype" content="description">
<meta name="role" content="">
</head><div id="breadcrumbs"></div>

<table border="0" cellpadding="0" cellspacing="0" style="width: 100%;">
<!-- du texte html -->
=======================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 ?
Constantin G. (Guest)
on 2009-05-19 01:55
(Received via mailing list)
Je pensais que vous vouliez vous débarrasser de <body>. 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>
Ze l. (Guest)
on 2009-05-19 13:03
Constantin G. wrote:
> Je pensais que vous vouliez vous débarrasser de <body>. 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 <body>
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 <body> et </body>
- 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>.*<p>(\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 <body>
et </body>, il ressemble à ça :
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>bienvenue</title>
<meta name="filetype" content="description">
<meta name="role" content="">
</head>
<div id="breadcrumbs"></div>

<!-- du code html (entre autre des paragraphes)-->
<p>

<script language="JavaScript" type="text/javascript"><!--
        contentPage.onload();
// --></script>
</p>

je souhaite récupérer tout ce qu'il y a entre </head> et <p>. (en
excluant ces balises)
Mais mon pattern ne semble pas matché

Merci pour votre aide
Ze l. (Guest)
on 2009-05-20 14:07
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 = "<p>coucou<p/><p>coucou2</p><p>"
je voudrais avoir au final chaine ="<p>coucou<p/><p>coucou2</p>"
donc retirer le dernier <p>
Peut être une option à ajouter à sub ?
This topic is locked and can not be replied to.