Une regexp bien corcée ça vous dit ?

Je suis en train de me casser la tête sur une interface en html - php qui est capable de traiter des fichiers textes assez simples.
“Assez simples” parce que je veux juste qu’ils aient 2 possibilités:

  • Donner une url dans des balises
  • Donner une commande dans une balise .

A l’affichage de ces fichiers, j’ai des regexp qui détectent ces balises, et qui transforment l’url en vrai lien, et qui mettent en gras les commandes.

Ca marche nickel, sauf… Si je met 2 urls dans la même ligne. C’est à dire si j’écris: “Un site cool du texte Un autre site cool” hé ben ma regexp detecte la première balise et la dernière, mais pas celles du milieu. Et pareil pour les évidemment.
J’aimerais bien améliorer ça. Ya un pro des regexp qui peut me dire comment ?
Les voici:

Pour les url:

$line = preg_replace(’/(.*)/’,’$1’,$line);

Pour les cmd:

$line = preg_replace(’/(.*)/’,’$1’,$line);

Merci pour toute aide !

Ca fait longtemps que je n’ai pas faiit de php mais a vu de nez je me dis que tu ferai mieux de mettre tout ça dans une fichier xml et de te coder une petite feuille xsl des familles et de générer le tout avec un parther xml dans ton code. Je crois que php4.3.4 a un analyseur directement intégré mais je ne l’ai jamais utilisé personnellement
Ouaip je sais, la réponse est un peu hors sujet, mais moi je dis, xml, ca poutre !

Ce message a été édité par BodySplash le 15/06/2004

Effectivement, pour ce genre de trucs, un parser xml serait idéal.

Sinon, pour la RegExp, l’étoile “*” a tendance à prendre le maximum d’occurences possibles. Certains langages de regexp permettent de définir une “lazy *” (qui prends le moins d’occurences possibles), qui s’écrit *? .

[quote]$line = preg_replace(’/(.*)/’,’$1’,$line);[/quote]Un truc dans ce genre devrait marcher:

$line = preg_replace(’/([^>].*)/’,’$1’,$line);

Sauf si bien sur ton texte contiens le symbole ‘>’

Tzim a raison l’étoile est “gourmande” (greedy pour les fanatiques anglosaxons). Elle va chercher jusqu’a ce qu’elle ne trouve plus rien.

Pour annuler ce phénomène et la rendre du coup ungreedy un ? à placer juste après suffit.
Comme ça tes regexp devrait mieux fonctionner.

Il est parfois plus simple dans un regexp de lister tout ce que l’on ne veut pas plutot que l’inverse.
En l’occurence pour tes url tu ne veux pas de “<”, “>”. Ce qu’a proposé Merlin.

Je ne sais pas si ça peut t’intéresser, mais si voilà un code (directement pompé des archives de l’excellent www.phpinfo.net) qui transforme toute url en url cliquable (les
sont remplaçables par des $n).

<? $texte = [b]eregi_replace[/b]( "([[:alnum:]]+)://([^[:space:]]*)([[:alnum:]#?/&=])", "1://23", $texte); ?>

L’intérêt est limité dans la mesure où tu dois faire le même code pour tes commandes, mais c’est peut-être un plus pour tes utilisateurs qui n’auront pas besoin de balise.

Merci à tous pour vos réponses !
J’ai rajouté un ? pour rendre mon étoile moins “greedy” (j’aurai appris un terme de geek today), et ça a très bien marché.
Par contre Merlin ta solution à rien changé

Voilà donc la ligne qui fonctionne très bien:

$line = preg_replace(’/(.*?)/’,’$1’,$line);