Petite broutille sur expressions régulières

Sanceray3
Invité n'ayant pas de compte PHPfrance

01 sept. 2009, 12:13

Bonjour à tous,

voilà je vous explique mon problème.

J'utilise les expressions régulières pour supprimer tout un tas d'éléments dans une chaine de caractères dont les prépositions, la ponctuation.... Le but étant à la fin de faire ressortir les mots clefs pour construire des paramètres d'un permalien.

Ca marche très bien, mon seul soucis c'est que dès que ma chaine de caractères se termine par un signe de ponctuation, mon expression ne le retire pas alors qu'il devrait ! Je pense que je ne fais pas forcément les choses comme il faut mais j'ai parcouru le web à la recherche d'infos mais je ne m'en sors pas !

La particularité de mon expression c'est qu'elle doit pouvoir supprimer la ponctuation et les prépositions n'importe où dans la chaîne, que ça soit en début, milieu ou fin de chaîne, et ce qu'il y ait un ou x espaces devant le mot ou le signe de ponctuation. Ca marche très bien sauf pour le cas de figure où ma chaine se termine par un signe de ponctuation !

Avant toute chose, et pour que ça soit plus compréhensible pour vous, voici mon code en version allégé (je vous ai mis juste l'essentiel, normalement j'ai d'autres fonctions qui s'occupent de faire la suppression des doubles "-"..... :

Code : Tout sélectionner

$machaine = "les expressions régulières sont un casse tête pour moi !"; $prepositions = "un|une|le|la|les|et|de|du|des|\p{P}"; $machaine = preg_replace("/\b(\s)*($prepositions)(\s)*\b/i","-", $machaine);
Dans ce cas là, j'obtiens : "- expressions régulières sont - casse tête pour moi !" alors que j'aurais aimé obtenir la même chose sans le "!". Si je place le point d'exclamation au milieu de ma chaîne, il est bien remplacé par "-" alors qu'en fin non.

Savez vous pourquoi, qu'est ce que je fais mal, il y a t il une option supplémentaire à passer.

Par avance grand merci pour vos conseils qui me permettront je l'espère de me retirer cette petite épine du pied ! ;)

Eléphant du PHP | 369 Messages

01 sept. 2009, 12:48

[/quote]
Tu veux parler d'un pattern de ce style?
$pattern ="#[\!]$#";
Ne suprime le ! QUE s'il est à la fin de la chaine.
Mets en oeuvre ta recherche complête en intègrant ce pattern au tiens,
tu devais arriver à ce que tu veux:

@+ ;)

ViPHP
ViPHP | 4039 Messages

01 sept. 2009, 13:05

Il faut s'y prendre autrement, par étapes:

1) mettre tout en minuscules
2) remplacer les caractères accentués et semblables
3) filtrer tout ce qui n'est pas un caractère alphabétique ou numérique

Code : Tout sélectionner

[^a-z0-9]
4) filtrer tout ce qui est trop court (1 ou 2 lettres, par exemple)

Code : Tout sélectionner

[a-z]{1,2}
5) filtrer les mots non voulus (dans ce cas, les prépositions).
etc...
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphanteau du PHP | 27 Messages

01 sept. 2009, 17:27

Je ne suis pas spécialiste en expressions régulières mais je te parie que si tu mets un caractères spécial en début de chaine il ne sera pas supprimé non plus! :)

Essayes en enlevant les "\b":
$machaine = "les expressions régulières sont un casse tête pour moi !";
$prepositions = "un|une|le|la|les|et|de|du|des|\p{P}";        
$machaine = preg_replace("/(\s)*($prepositions)(\s)*/i","-", $machaine);
Au passage, attention à l'odre dans lequel tu places tes prépositions!
Si tu mets "un" avant "une", toutes les prépositions "une" seront remplacées par "-e" (de même pour "le" et "les", etc.)