Page 1 sur 1

Regex et méta-caractères

Posté : 14 déc. 2006, 19:52
par FredoMkb
Bonjour à tous :)

Voici mon petit soucis du jour...

1. Soit un bout texte balisé (peu importe les balises pour l'instant), par exemple :

Code : Tout sélectionner

<balise>Un très joli bout de texte</balise>
2. Je dois traiter le texte entre les balises avec une expression rationnelle (régulière) pour isoler certaines parties

3. Il se trouve que le texte entre les balises peut contenir un caractère, séparant deux parties à isoler ultérieurement, qui est aussi un méta-caractère du langage Regex, soit la barre verticale "|", par exemple :

Code : Tout sélectionner

<balise>Un très joli bout de texte...|Encore un bout de texte</balise>
4. Donc, question : comment faire pour récupérer l'ensemble du texte entre les balises sans que le caractère "|" soit interprété par le masque Regex comme un méta-caractère ?

5. Concrètement, soit cet exemple :

Code : Tout sélectionner

<balise>Un très joli bout de texte...|Encore un bout de texte</balise>
6. Comment faire pour récupérer l'ensemble du texte, soit :

Code : Tout sélectionner

Un très joli bout de texte...|Encore un bout de texte
Je précise qu'il s'agit d'utiliser une expression rationnelle, de type Pcre (Expressions rationnelles compatibles Perl).

J'ai pas mal cherché, mais sans succès malheureusement... mon niveau étant vraiment très modèste, j'ai pu passer devant une bonne réponse sans pour autant m'en être apperçu... c'est dire si je suis débutant sur ces sujets là...

Merci à tous ceux qui pourraient m'apporter quelque piste instructive :)

Posté : 14 déc. 2006, 22:09
par Cyrano
Montre déjà ton expression de départ, on aura une base de travail :-k

Posté : 15 déc. 2006, 02:37
par FredoMkb
Montre déjà ton expression de départ, on aura une base de travail :-k
Oui, en effet, j'étais un peu pressé et dans laprécipitation je n'y ai pas pensé...

Bon, l'expression sur laquelle je dois intervenir, est issue d'une application web connue, dont j'éssais d'apporter quelques personnalisations...

Donc, il s'agit de traiter les balises "img" et "/img" (c'est du BbCode) existantes dans un texte, voici l'exprésion originale existante dans l'application :
$text = preg_replace('#\[img\]((ht|f)tps?://)([^\s<"]*?)\[/img\]#e', 'handle_img_tag(\'$1$3\')', $text);
Alors, évidemment, si je comprennais tout, je pense que j'aurais pu trouver une soluce, mais là, je ne pige pas, par exemple, quel est le rôle de cette partie :
((ht|f)tps?://)
Ainsi que celle-ci :
[^\s<"]
Les autres parties (du coup, il ne reste plus grand chose ;) ), ça va, je crois comprendre leur utilité...

Donc, pour être concrèt, en plus de l'adresse de l'image, il sera possible d'ajouter une ou plusieurs autres informations, séparées de l'url et entre elles par une barre "|", et le tout entre les balies "img" et "/img"...

Par exemple, voici un cas de figure qui pourrait se présenter :

Code : Tout sélectionner

[img]http://www.adresse/image.jpg|Auteur: M. Durand|Date: 06/2006[/img]
Je précise que les barres "|" et les textes à leur droite ne seront pas forcément toujours présents, mais on peut aussi trouver plusieurs barres et textes connexes...

Au fait, je voudrais travailler ces infos après avoir traité les balises "img", en récupérant, dans une variable, l'ensembe du texte contenu entre les balises "img", c'est-à-dire, l'adresse url ainsi que les éventelles autres informations existantes séparées par des barres "|"...

Par exemple, dans le code précédent, si j'arrive à récupérer le texte suivant dans une variable "$infos" par exemple :

Code : Tout sélectionner

http://www.adresse/image.jpg|Auteur: M. Durand|Date: 06/2006
Je pourrais alors faire :
$infosListe = explode('|', $infos);
Puis, isoler chaque élément par des :
$url = $infosListe[0];
$autuer = $infosListe[1];
$date = $infosListe[2];
// etc.
Mon soucis donc, est que, je pense, la barre "|" dans le texte est interprétée, à certains moments, comme faisant partie de l'expression Regex, et j'aimerais qu'elle soit plutôt traitée comme du simple texte...

Bref... je suis un peu long dans mes explications, mais, tout en écrivant ce message, j'aissais aussi de mettre un peu tout ça au clair dans mon esprit... j'espère que ce n'est pas trop confus pour vous :shock:

Voilà... si quelqu'un pouvait m'apporter un peu d'aide, ce serait vraiment génial =D>

Merci à tous :)

Posté : 15 déc. 2006, 03:28
par FredoMkb
Bon bon...

Pour essayer de comprendre un peu, j'ai simplifié au mieux l'expression Regex originale, et, surprise, maintenant ça a l'air de fonctionner nickel-chrome :)

Voici donc l'expression simplifiée :
$text = preg_replace('#\[img\](.*?)\[/img\]#e', 'handle_img_tag(\'$1\')', $text);
Bon, apparement ça fonctionne, et c'est déjà une bonne chose... mais je n'ai pas encore réussi à percer le mystère des parties de l'expression originale qui m'intriguaient, à savoir :
((ht|f)tps?://)
et
[^\s<"]
J'espère que quelqu'un saura m'éclairer un peu sur le rôle de ces deux bouts d'expression...

Encore merci :)

Posté : 15 déc. 2006, 09:36
par Cyrano
Ok, alors explications sur les extraits :
((ht|f)tps?://)
Signifie : chaine commençant par "ht" ou par "f" suivi de "tp" et terminé par "s" ou non puis suivi de "://" : on pourra donc vérifier ce masque avec "http://", "https://", "ftp://" ou "ftps://".
Entre les parenthèses, le "|" est un "OU", donc soit "ht" soit "f"; et le "?" se traduit par "0 ou 1" et s'applique au caractère qui précède, dont "s?" signifie "0 ou 1 s";
[^s<"]
Signifie : n'importe quel caractère sauf 's', '<' ou '"'

Posté : 15 déc. 2006, 13:36
par FredoMkb
Ok, alors explications sur les extraits : ...
Wouw \:D/ t'es vraiment un chef Cyrano, difficile de faire plus clair, merci :merci:

Et bien, il faudrait que je m'y penche de plus près sur la syntaxe des Regex, mais, malheureusement, la doc officielle, bien que très complète, n'est vraiment pas très didactique...

Au fait, ne connaîtrais-tu pas un tutorial simple et accèssible aux débutants et qui expliquerait, pas à pas, les bases des Regex ?

En tout cas, un grand merci pour ton aide efficace ! :pouce:

;)

Posté : 15 déc. 2006, 14:58
par Cyrano
Pour les tutos clairs, malheureusement, je n,en connais pas et j,ai moi même longtemps patiné dessus avant d'arriver à m'en servir à peu près convenablement, mais je suis encore loin d'en maîtriser toutes les subtilités. Nos deux gourous des Regexp (Ripat et Naholyr) ont bien créé des tutos, mais de mon point de vue personnel, ce n'est pas vraiment facile à aborder pour un débutant complet. Il y a quand même le site de Ripat qui pourra t'éclairer sur pas mal de points et tu aussi le tuto de Naholyr (pdf).

Posté : 16 déc. 2006, 14:46
par FredoMkb
Bonjour Cyrano et à tous :)

Pardon pour cette réponse un peu tardive...

Je viens de passer quelques heures à lire le tutorial de Ripat, et je dois dire que c'est vraiment très intéressant et instructif, mais, je l'avoue, c'est quand-même difficile d'assimiler toutes ces notions d'un seul coup, il me faudra, je pense (je suis sûr même), pas mal de pratique avant de pouvoir être un peu à l'aise avec les Regex...

En tout cas, c'est la conclusion qui m'a le plus impressionné, je cite la première phrase :
Voilà. Il y a encore tellement, tellement à dire sur ce sujet... J'espère que ce petit survol pourra contribuer à une meilleure utilisation des regex dans vos projets.
C'est le terme "petit survol" qui me laisse totalement perplèxe :shock: ... si c'est tuto ne représente qu'un simple "petit survol", je n'ose même pas imaginer ce que ça doit être de vouloir explorer ces techniques en profondeur :-s ... impossible de demander ça à mon neurone, il ne le supporterais pas :afraid:

Bref, ça ma permis en tout cas de comprendre un certain nombre de choses qui étaient totalement idéchiffrables avant, et je sens que je vais devoir relire certains passages à plusieurs reprises, mais c'est une excellente documentation, merci :)

Quant au Pdf de Naholyr, je n'ai pas encore eu le temps de l'aborder, mais ce sera la prochaine étape dans ma découverte des Regex...

Voilà... un peit topic rondement mené, avec solution et plein d'informations utilies en enrichissantes... que demende le peuple ? :D

Merci Cyrano :)

PS. Ha oui, j'ai adoré la page de tests des Regex, un petit outil d'optimisation très pratique, le top ! :pouce: