Forum: Rails France regexp et utf-8

Posted by 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?
Posted by 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
Posted by 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>
Posted by 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>
Posted by 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
Posted by 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
Posted by 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!
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.