Forum: Rails France regexp et utf-8

97be9bde51f8994b28e8699f12f06449?d=identicon&s=25 rmb (Guest)
on 2010-02-21 23:57
(Received via mailing list)
Bonjour,

Je n'arrive pas trouver la réponse à un petit problème concernant les
regexp (avec ruby 1.9.1). Mais comme je viens de découvrir le monde
merveilleux des regexp, j'imagine que la solution doit probablement
être toute bête. alors voila:

J'ai une ligne html qui ressembme à ça:
<th  class="date">mai09</th>

Dans mon appli Rails, je vais avoir besoin de récupérer la date.
Je repère ma date avec cette petite formule.
[a-z]{3,}\.?\d{2}

Ca marche bien, sauf pour le mois "août", à cause de l'accent... mes
essais ont tous fait plouf jusqu'ici.

Une idée?
9a00ce848763a4472291fcbcefd31a07?d=identicon&s=25 Jean-Baptiste Barth (Guest)
on 2010-02-22 00:44
(Received via mailing list)
Bonsoir,

Le 21 février 2010 23:56, rmb <rmeralli@free.fr> a écrit :

> Dans mon appli Rails, je vais avoir besoin de récupérer la date.
> Je repère ma date avec cette petite formule.
> [a-z]{3,}\.?\d{2}
>
> Ca marche bien, sauf pour le mois "août", à cause de l'accent... mes
> essais ont tous fait plouf jusqu'ici.
>
> Une idée
> ?


Ruby 1.9 commence à introduire des syntaxes pour gérer spécifiquement
les
propriétés utf8. Ce qui suit marche bien en 1.9.1 mais non en 1.8.7 :

"août".match(/^\p{L}+$/)

Dans ton cas il faudrait donc remplacer [a-z] par p{L}, et voir si ça te
renvoie ce qu'il faut.
Une référence ici : http://www.regular-expressions.info/refunicode.html

Cdt,
--
JB
97be9bde51f8994b28e8699f12f06449?d=identicon&s=25 rmb (Guest)
on 2010-02-22 10:08
(Received via mailing list)
Ca marche effectivement.

Très intéressant, merci!


On 22 fév, 00:43, Jean-Baptiste Barth <jeanbaptiste.ba...@gmail.com>
97be9bde51f8994b28e8699f12f06449?d=identicon&s=25 rmb (Guest)
on 2010-03-01 00:36
(Received via mailing list)
Bon fausse joie :(

Bizarrement, ça marche en tant que script ruby, mais sous rails, qui
me renvoit un méchant

"invalid character property name {L}: /^\p{L}{3,}\.?/"

Etonnant non?! Là ça me dépasse. Si quelqu'un avait une idée a me
soumettre.

Pour info:

Ruby version  1.9.1 (x86_64-linux)
RubyGems version  1.3.6
Rack version  1.0
Rails version  2.3.5
Active Record version  2.3.5
Active Resource version  2.3.5
Action Mailer version  2.3.5
Active Support version  2.3.5



On 22 fév, 00:43, Jean-Baptiste Barth <jeanbaptiste.ba...@gmail.com>
4a7982065027f6678cf86fd469d34f08?d=identicon&s=25 Renaud (Nel) Morvan (Guest)
on 2010-03-01 18:24
(Received via mailing list)
Globalement parser du html avec des regexp c'est pas l'idée du siècle
car dès que le html ne sera plus valide tu vas obtenir n'importe quoi
mais si tu peux faire confiance au html c'est good enough.

Ceci dit il y a plein de solution à ton problème, il suffit d'en
comprendre la nature:
1) depuis très longtemps les regExp ruby fonctionne avec l'utf8 en
1.8.2 il suffisait de $KCODE = 'u' et depuis c'est souvent par defaut.
2) [a-z] ne contient pas les caractères accentués, ni majuscule, juste
de a à z,  \w  en revanche signifie en gros caractères alphabétique au
sens large
3) [a-zû] fonctionne aussi
4) n'utilise pas encore les subtilité de ruby 1.9, sinon tu risques
d'entendre tes oreilles siffler, c'est encore trop tôt, 100% des vrais
prod sont en 1.8;x

Pour en revenir à ton problème de parser du html avec des regexp voilà
quelques solutions:

Générique:
/<th  class="date">(.*?)<\/th>/m

Spécifique:
/<th  class="date">([\w\d]*)<\/th>/m

Ultra spécifique:
/<th  class="date">(\w{3,}\d{2})<\/th>/m

Tu as juste à regarder dans $1 pour trouver le résultat
91eb330fb36d1e03c856574dfb77d2bc?d=identicon&s=25 Thibaut Barrère (thbar)
on 2010-03-01 21:13
(Received via mailing list)
Hello,

> Je n'arrive pas trouver la réponse à un petit problème concernant les
> regexp (avec ruby 1.9.1). Mais comme je viens de découvrir le monde
> merveilleux des regexp, j'imagine que la solution doit probablement
> être toute bête.

je rajoute +1 à la première remarque de Renaud - franchement:
n'utilise pas les regexp pour parser du HTML. Prend un hpricot ou un
nokogiri :)

Après puisque tu indiques que tu découvres les regexp, voilà quelques
remarques:
- les regexp peuvent être très utiles et http://www.rubular.com pourra
t'aider quand tu t'en sers
- mais on dit souvent: quand tu as un problème, et que tu penses aux
regexp pour le régler, et bien tu as deux problèmes: ton problème et
la regexp
- et si tu veux lire pourquoi il ne faut pas utiliser les regexp pour
parser du html, et rigoler au passage, lis:
http://stackoverflow.com/questions/1732348/regex-m...

en espérant t'avoir été utile!

-- Thibaut
97be9bde51f8994b28e8699f12f06449?d=identicon&s=25 rmb (Guest)
on 2010-03-01 21:39
(Received via mailing list)
> Globalement parser du html avec des regexp c'est pas l'idée du siècle
> car dès que le html ne sera plus valide tu vas obtenir n'importe quoi
> mais si tu peux faire confiance au html c'est good enough.

Oui, je sais bien, mais mon html n'est d'une part pas très bien formé
et d'autre part pas tellement susceptible de bouger. La forme des
données encore moins, pour l'instant je ne vois pas tellement d'autre
façon de faire.


> prod sont en 1.8;x
Ah... suis passé en 1.9.1 parce que ma distrib a upgradé (archlinux).
J'aurais du figer la version.
Pour le coup j'ai recompilé la 1.8.7

> /<th  class="date">(\w{3,}\d{2})<\/th>/m
>
> Tu as juste à regarder dans $1 pour trouver le résultat

Effectivement ça marche enfin.
Merci!
This topic is locked and can not be replied to.