OVH Cloud OVH Cloud

Expression reguliere

11 réponses
Avatar
Julduck
Bonjour a tous,

Je lutte depuis quelques jours contre une expression reguliere.
J'ai un document qui contient des balises {text} ou texte est un mot de
15 lettres maximum.
J'aimerais recuperer tous ces mots, mais je n'y arrive pas ...

J'ai essaye:
ereg( '\\{[:alpha:]+\\}', $text, $regs );
mais il ne me retourne aucune valeur.

Quelqu'un a une idee?

Julien

10 réponses

1 2
Avatar
Guillaume Bouchard
Julduck wrote:
Bonjour a tous,


Coucou.

Je lutte depuis quelques jours contre une expression reguliere.


Tant que ça ?

J'ai un document qui contient des balises {text} ou texte est un mot de
15 lettres maximum.
J'aimerais recuperer tous ces mots, mais je n'y arrive pas ...

J'ai essaye:
ereg( '{[:alpha:]+}', $text, $regs );
mais il ne me retourne aucune valeur.


Il est déconseillé d'utiliser ereg pour des questions de perfs.

$pattern = '`{(.*?){,15}}`';
preg_match_all($str,$pattern,$match);

Cela te renvoie ?

--
Guillaume.

Avatar
Vincent Lascaux
$pattern = '`{(.*?){,15}}`';
preg_match_all($str,$pattern,$match);


Plutot

$pattern = "/{[^}]{1,15}}/';
preg_match_all($pattern, $str, $match);

non ?

.* c'est 'autant de caracteres qu'ont veut'
.*? c'est exactement la même chose (autant de caracteres qu'on veut, ou
rien, mais rien est déjà inclus dans "autant de caracteres qu'on veut")
(.*?){,15}, c'est autant de caracteres qu'ont veut, repeté entre 0 et 15
fois... C'est donc aussi exactement la même chose.



--
Vincent

Avatar
Olivier Miakinen

$pattern = '`{(.*?){,15}}`';
preg_match_all($str,$pattern,$match);


Plutot

$pattern = "/{[^}]{1,15}}/';
preg_match_all($pattern, $str, $match);

non ?


Oui.

Sachant que l'accolade fermante n'est un caractère spécial ni en dehors
ni à l'intérieur des [], on peut même simplifier encore :

$pattern = "/{[^}]{1,15}}/';

.* c'est 'autant de caracteres qu'on veut'


Oui.

.*? c'est exactement la même chose (autant de caracteres qu'on veut, ou
rien, mais rien est déjà inclus dans "autant de caracteres qu'on veut")


La différence est la « gourmandise » de l'expression, donc ce n'est pas
exactement la même chose.

(.*?){,15}, c'est autant de caracteres qu'on veut, repeté entre 0 et 15
fois... C'est donc aussi exactement la même chose.


Mais surtout ce n'est pas ce que demandait Julien Duck. Ta version est
correcte, même si on peut encore la simplifier comme je l'écrivais plus
haut.

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)


Avatar
Laurent

Plutot

$pattern = "/{[^}]{1,15}}/';
preg_match_all($pattern, $str, $match);



tant qu'à faire...

$pattern = "/{[^{]+}/";
preg_match_all($pattern, $str, $match);

sauf si quand un mot fait plus que 15 lettres il ne doive pas être
considéré comme une balise, bien sûr.

[mode pointilleux on]
rem : petite faute dans ton $pattern : soit commencer par '/ soit finir
par /", mais mixer les 2 doit donner une bonne erreur des familles :)
[mode pointilleux off]

Avatar
Guillaume Bouchard
Vincent Lascaux wrote:
$pattern = '`{(.*?){,15}}`';
preg_match_all($str,$pattern,$match);


Plutot

$pattern = "/{[^}]{1,15}}/';
preg_match_all($pattern, $str, $match);

non ?

.* c'est 'autant de caracteres qu'ont veut'
.*? c'est exactement la même chose (autant de caracteres qu'on veut, ou
rien, mais rien est déjà inclus dans "autant de caracteres qu'on veut")
(.*?){,15}, c'est autant de caracteres qu'ont veut, repeté entre 0 et 15
fois... C'est donc aussi exactement la même chose.


<mode excuse>
Ba eu, j'étais fatigué, j'ai pas vu le train passer, j'ai pensé que,
enfin voila, puis en fait, enfin c'est clair non ?
</mode excuse>

Moralité, il faut se relire, et je dois dormir.

Une autre, qui fonctionne

`{.{,15}?}`

Le ? sert à éviter la gourmandise.

--
Guillaume.


Avatar
Laurent
et encore mieux...
$pattern = "/{.+}/U";

:)
Avatar
Olivier Miakinen
et encore mieux...
$pattern = "/{.+}/U";


On peut toujours faire mieux :
$pattern = "/{.+}/U";

:)


:D

(et bravo pour le mode pointilleux, j'avions point vu)

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
frederic girard
Olivier Miakinen wrote:

et encore mieux...
$pattern = "/{.+}/U";



On peut toujours faire mieux :
$pattern = "/{.+}/U";


:)



:D

(et bravo pour le mode pointilleux, j'avions point vu)

Aller les gars, je vois que vous etes en forme;)

Pour info, que signifie le '/U' ?


Avatar
CrazyCat
frederic girard wrote:
Aller les gars, je vois que vous etes en forme;)
Pour info, que signifie le '/U' ?


U (PCRE_UNGREEDY) : Cette option inverse la tendance à la gourmandise
des expressions régulières. Vous pouvez aussi inverser cette tendance au
coup par coup avec un ?. De même, si cette option est activée, le ?
rendra gourmand une séquence.

--
Aide informatique: http://help-info.forumactif.com
Humour: http://www.chatfou.com
Tchattez en liberté: http://www.crazy-irc.net

Avatar
Julduck
Salut,

Je vois que ma question vous a fait plaisir ;o)

J'avais en effet trouvé que preg etait mieux et j'avais meme trouvé:
$template = "/{[a-z_:]{0,15}}/";
if( preg_match_all( $template, $design, $regs_lists ) )

Merci du coup de main ...

Julien
1 2