expression reguliere et suppression de pluriel

Eléphant du PHP | 245 Messages

26 avr. 2010, 17:02

j'ai une petite question
Et je sais que les pros du PHP et des exp reg vont pouvoir me donner une réponse :

Le but :
supprimer les "s" en fin de mots dans des chaines composées de caractères alphabetiques minuscules et d'espace

Voici mon code :

$mots_cles="assureurs assurances services courtiers démarcheurs démarcheuses";
echo $mots_cles."<br>";

//exp reg retirant les lettres s en fin de mots de plus de 4 lettre (suppressions des pluriels)
//mot de fin (ou un seul mots)
$mots_cles=preg_replace("/([a-z]{4,30})s$/","$1",$mots_cles);
//mot du debut
$mots_cles=preg_replace("/^([a-z]{4,30})s([ ]{1})/","$1$2",$mots_cles);
//mots du milieu
$mots_cles=preg_replace("/([ ]{1})([a-z]{4,30})s([ ]{1})/","$1$2$3",$mots_cles);
	
echo $mots_cles;

Ce qui donne

assureurs assurances services courtiers démarcheurs démarcheuses
assureur assurance services courtier démarcheurs démarcheuse



Alors que son analogue Javascript fonctionne :

Code : Tout sélectionner

var mots_cles="assureurs assurances services courtiers démarcheurs démarcheuses"; document.write(mots_cles+"<br>"); //exp reg retirant les lettres s en fin de mots de plus de 4 lettre (suppressions des pluriels) //mot de fin (ou un seul mots) mots_cles=mots_cles.replace(/([a-z]{4,30})s/g,"$1",mots_cles); //mot du debut mots_cles=mots_cles.replace(/^([a-z]{4,30})s([ ]{1})/g,"$1$2",mots_cles); //mot du milieu mots_cles=mots_cles.replace(/([ ]{1})([a-z]{4,30})s([ ]{1})/g,"$1$2$3",mots_cles); //mots_cles = transforme_mots_cles_pour_recherche_annonce(mots_cles); document.write(mots_cles+"<br>");

assureurs assurances services courtiers démarcheurs démarcheuses
assureur assurance service courtier démarcheur démarcheuse



Si vous voyez le problème, votre aide est la bien venue.

Eléphant du PHP | 70 Messages

26 avr. 2010, 17:38

Salut,

Tu peux faire ça avec une seule expression, il faut juste enlever le dollar pour que tous les mots soit parser
$mots_cles=preg_replace("/([a-z]{4,30})s/","$1",$mots_cles);

ViPHP
ViPHP | 5462 Messages

26 avr. 2010, 17:48

je plussois, sinon pour la limitation de caractères t'es pas obligé de mettre un maximum il suffis de rien mettre apres la virgule
$mots_cles=preg_replace("/(\w{4,})s/u","$1",$mots_cles);

Eléphant du PHP | 245 Messages

27 avr. 2010, 09:50

Merci, c'est bien ça
Je modifie un peu en ajoutant des espaces pour bien prendre en compte les s en fin de mots (donc suivi d'un espace) de plus de 4 caractères, ce qui donne :
$mots_cles=$mots_cles." ";
	
$mots_cles=preg_replace("/(\w{4,})s /","$1 ",$mots_cles);
$mots_cles=substr($sortie,0,strlen($mots_cles)-1);
merci les gars.

ViPHP
ViPHP | 5462 Messages

27 avr. 2010, 10:02

lu, pour ton espace tu peu faire " \s" :
(\w{4,})s\s

Eléphant du PHP | 245 Messages

27 avr. 2010, 10:41

oki merci

Eléphant du PHP | 453 Messages

27 avr. 2010, 11:22

Hello,
[...]il suffis de rien mettre apres la virgule
+1
lu, pour ton espace tu peu faire " \s" :(\w{4,})s\s
edit : un smiley malicieux s'est introduit par ici. Qu'est farceur ce smiley.

J'ai pensé à la même chose que toi pour la classe générique (\w). Néanmoins, en lisant ton motif, il y a une toute petite erreur s'il y a l'ajout du saut de ligne/espace/tabulation.
Je penserai plutôt à ce motif si je ne m'abuse :
$motifSingulier = "#\b(\w{4,})s(\s|\.)?\b#";
Bonne journée ^^
Modifié en dernier par niuxe le 27 avr. 2010, 11:26, modifié 1 fois.
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia

ViPHP
ViPHP | 5462 Messages

27 avr. 2010, 11:25

non

\n : Matches any whitespace character (spaces, tabs, line breaks).

:wink:

ici sur la doc http://www.pcre.org/pcre.txt (vers la moitié)
The horizontal space characters are:

U+0009 Horizontal tab
U+0020 Space
U+00A0 Non-break space
U+1680 Ogham space mark
U+180E Mongolian vowel separator
U+2000 En quad
U+2001 Em quad
U+2002 En space
U+2003 Em space
U+2004 Three-per-em space
U+2005 Four-per-em space
U+2006 Six-per-em space
U+2007 Figure space
U+2008 Punctuation space
U+2009 Thin space
U+200A Hair space
U+202F Narrow no-break space
U+205F Medium mathematical space
U+3000 Ideographic space

The vertical space characters are:

U+000A Linefeed
U+000B Vertical tab
U+000C Formfeed
U+000D Carriage return
U+0085 Next line
U+2028 Line separator
U+2029 Paragraph separator

Eléphant du PHP | 453 Messages

27 avr. 2010, 11:57

A moins que je n'aie pas bien compris ce que tu veux me dire, je crois que tu te trompes : "\n" est moins permissif que "\s". Je t'invite à tester la string avec \n et \s et ainsi que les deux motifs afin que tu puisses voir où il y a soucis sur la string (alignée ou avec des sauts de lignes).

Sur ton lien, on retrouve :
Generic character types

Another use of backslash is for specifying generic character types. The
following are always recognized:

\d any decimal digit
\D any character that is not a decimal digit
\h any horizontal whitespace character
\H any character that is not a horizontal whitespace character
\s any whitespace character
\S any character that is not a whitespace character
\v any vertical whitespace character
\V any character that is not a vertical whitespace character
\w any "word" character
\W any "non-word" character
Au passage, mon petit aide mémoire ici et motif testé sur un testeur en ligne.

Bien à toi
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia

ViPHP
ViPHP | 5462 Messages

27 avr. 2010, 13:14

oh oui je me suis tomper #-o
\s : Matches any whitespace character (spaces, tabs, line breaks).
on est bien d'accord :wink: