Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Expression rationnelle

13 réponses
Avatar
Stéphane Santon
Bonjour,

Pour le calcul d'une url, je désire filtrer les petits mots de mon
choix dans une chaine :
- placés en début de chaine et suivis d'un tiret,
- placés en fin de chaine et précédés d'un tiret,
- placés dans la chaine et entourés d'un tiret.

Voici ce que je fais et qui fonctionne.

$lsMasque = array(
'(^au-|^de-|^du-|^des-|^en-|^l-|^le-|^la-|^les-)',
'(-au-|-de-|-du-|-des-|-en-|-l-|-le-|-la-|-les-)',
'(-au$|-de$|-du$|-des$|-en$|-l$|-le$|-la$|-les$)'
);
$lsUrl = preg_replace( $lsMasque, array('','-',''), $lsUrl);

Mais y aurait-il plus simple ?

Merci

--
Stéphane

Jeune Chambre Economique de Saintes *** http://www.jce-saintes.org
Agitateurs d'idées... accélérateurs de talents !

BTS Electrotechnique *** http://enselec.santonum.eu

3 réponses

1 2
Avatar
Olivier Miakinen
Le 13/05/2013 17:37, Pierre Maurette m'a répondu :

Par ailleurs, bien que le résultat soit le même entre les deux scripts,
je ne suis pas sûr qu'il soit celui souhaité par Stéphane lorsque deux
petits mots se suivent à l'intérieur d'une chaîne :
"le-village-au-fond-de-la-vallee"
-> "village-fond-la-vallee" et pas "village-fond-vallee"



Pour ce cas, il me semble qu'une rustine serait d'appliquer le
preg_replace() plusieurs fois. Tant que "ça matche".



Oui. Une méthode plus directe, mais plus difficile à lire pour qui
maîtrise mal les regexp, serait d'utiliser les assertions.
Avatar
Pierre Maurette
Olivier Miakinen :
Le 13/05/2013 17:37, Pierre Maurette m'a répondu :

Par ailleurs, bien que le résultat soit le même entre les deux scripts,
je ne suis pas sûr qu'il soit celui souhaité par Stéphane lorsque deux
petits mots se suivent à l'intérieur d'une chaîne :
"le-village-au-fond-de-la-vallee"
-> "village-fond-la-vallee" et pas "village-fond-vallee"



Pour ce cas, il me semble qu'une rustine serait d'appliquer le
preg_replace() plusieurs fois. Tant que "ça matche".



Oui. Une méthode plus directe, mais plus difficile à lire pour qui
maîtrise mal les regexp, serait d'utiliser les assertions.



La rustine que je proposais - même pas vraiment d'ailleurs - est en
fait assez poreuse, et même toute pourrite. Elle débouche sur du non
maintenable puisque basée sur le fait que '-blah-' est remplacé par '-'
et rien d'autre. Il ne semble pas aberrant de décider un jour de
remplacer par '', '_', '.', etc. Il vaut mieux faire du propre tout de
suite que plus tard dans l'urgence.

--
Pierre Maurette
Avatar
Olivier Miakinen
Le 13/05/2013 19:40, Pierre Maurette m'a répondu :

Oui. Une méthode plus directe, mais plus difficile à lire pour qui
maîtrise mal les regexp, serait d'utiliser les assertions.



[...] Il vaut mieux faire du propre tout de suite que plus tard dans
l'urgence.



D'accord. Alors voici ce que je propose.

$lsMasque = array(
'/(^|-)(au|de|du|des|en|l|le|la|les)(?=-|$)/',
'/^-/'
);
$lsUrl = preg_replace($lsMasque, '', $lsUrl);

Avec l'hypothèse qu'il n'y a jamais de trait d'union à conserver
en début de chaîne, ça devrait fonctionner.
1 2