PARSE::REGEX :: Discussion
akira16-Dec-2006/11:45:24+1:00
Bonjour

En php j'utilisais assez souvent les regex DE MANIERE PRIMITIVE et je m'en sortais très bien. Notemment grace à ce site qui m'indiquait en couleurs mon résultat et mes sorties array : http://www.lumadis.be/regex/test_regex.php
Super pratique

Je m'en servais essentiellement pour rechercher des motifs simples comme du texte encadré entre deux balises ( cas simple et classique ! )
<p>texte à récupérer</p>
REGEX : #<p>(.*?)</p>#
Le regex est très simple à expliquer : tu prends tout ce qui commence par <p> jusqu'a </p> QU'UNE FOIS.
Je récupérais le tout dans un tableau et la valeur recherchée était contenue dans tableau[2] par exemple.

Pour les cas plus compliqués comme ici
<td><img src="http://images.nana.com/1.gif" border="0"><a href="page1.html">texte a récuperer 1</a></td><td class="tahoma_gf"><img src="http://images.nana.com/1.gif" border="0"><a href="page2.html">texte a récuperer 2</a> </td>
La solution consistait à ratisser plus large et plus haut ! Mais toujours sur le même principe
REGEX :
#<td(.*?)<img src="http://images.nana.com/1.gif" border="0"><a href="page2.html">(.*?)</a>#

Ici il me suffisait de prendre pile poile resultat[2][1] par exemple et le tour était joué.

Au pire je multipliais dans une certaine mesure mes (.*?) afin de récupérer plusieurs valeurs comme le TEXTE A RECUPER et l'url de l'IMAGE par exemple.
Au pire je perdais quelques secondes mais c'est tout.

J'ouvre ce thread en fait car en REBOL benh j'ai fais pas mal d'essais et je suis toujours face à un mur avec PARSE.

Le parse est une bonne idée, mais qu'en est t-il pour les sites non XHTML codé comme des sauvages ?

N'existe t'il pas un moyen de coder en rebol :
prends tout ce qui commence par ? puis prends tout ce qu'il y a APRES puis ? pour ne prendre que la chaine ? qui finit par ?
En fait une illustration REBOL du premier et deuxième exemple me ferait le plus grand bien. Ainsi je saurais par quoi commencer.

Parceque là j'ai comme envie de stocker ma page HTML dans mysql et appeler une fonction PHP pour les regex.
N'y voyez là aucune critique ( je suis aussi là pour apprendre ) mais j'ai envie de rester pragmatique puisque je sais faire en php

Je lui ferais stocker les résultats dans mysql et le programme REBOL reprendrait ainsi la main au retour de la fonction PHP ( c'est possible ca ???? )
coccinelle16-Dec-2006/12:23:49+1:00
Avec parse ce n'est pas beaucoup plus compliqué. Le premier exemple :
parse "<p>texte à récupérer</p>" ["<p>" copy r to "</p>" 4 skip]
print r
Le second :
t: {<td><img src="http://images.nana.com/1.gif" border="0"><a href="page1.html">texte a récuperer 1</a></td><td class="tahoma_gf"><img src="http://images.nana.com/1.gif" border="0"><a href="page2.html">texte a récuperer 2</a> </td>}

l: length? f: {<img src="http://images.nana.com/1.gif" border="0"><a href="page2.html">} 

parse/all t ["<td" copy r1 to f l skip copy r2 to "</a>" to end]
print [r1 newline r2]
akira16-Dec-2006/14:06:26+1:00
re coccinelle

J'ai bien compris pour le premier cas ( sauf peut etre SKIP )
SKIP : Returns the series forward or backward from the current position.
4 skip signifie t-il à partir du 4 eme caractère ? soit juste après les 3 caractères de "<td>" ?

J'ai oublié de mentionner que les éléements à recupérer pour le deuxième exemple sont au nombre de 2 ( TEXTE A RECUPER 1 + TEXTE A RECUPERER 2 )

Pourrais tu me redonner un apercu total du deuxième exemple ; attention au <td> et <td class ...>

Cela me permettra de cogiter plus sereinement, puisque ces 2 cas sont à peu près tout ce que j'ai besoin de savoir pour PARSE (regex)

Après il ne me restera plus qu'à éléiminer tous les CRLF et les espaces entre les balises ( c'est l'autre thread URL :: )

Après quoi j'aurai atteind en REBOL le même niveau qu'en PHP.

coccinelle16-Dec-2006/18:03:20+1:00
Akira, il faut que tu lises un peu la documentation sinon tu vas perdre trop de temps à tatonner.
akira17-Dec-2006/4:39:34+1:00


Je m'attaques à la notice du PARSE dès qu'il y a plus aucun espace entre les balises. Les règles seront d'autant plus faciles à trouver par la suite ( j'espère )

Je garde bien au chaud tes exemples.

Je ferme ce thread.

A+
Didec18-Dec-2006/15:20:41+1:00
C'est peut-être ça ton problème : 'parse par défaut découpe selon les espaces. Il faut utiliser 'parse/all pour traiter la chaine d'un seul bloc !!
Philippe19-Dec-2006/10:43:47+1:00
Salut, Akira,

Tu peux aussi faire :

t: {<td><img src="http://images.nana.com/1.gif" border="0"><a href="page1.html">texte a récuperer 1</a></td><td class="tahoma_gf"><img src="http://images.nana.com/1.gif" border="0"><a href="page2.html">texte a récuperer 2</a> </td>}

blk: copy []   ;initialisation du bloc de résultat
a-rules: [ thru {l">} copy r to "</a>" (append blk r) | end ]
parse t [ some a-rules ]
probe blk

>>["texte a récuperer 1" "texte a récuperer 2"]


===Philippe

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2