Reg exp : je sux

46 réponses
AuteurMessage

ddpetit | Damien
Modérateur

Photo de ddpetit

Inscrit le : 03/05/2006

# Le 22/11/2008 à 19:27

Malheureusement ça ne change rien, normalement ce cas est géré par le # ... #i. Merci quand meme de ton aide

Loccasion.com - Vente de voitures d'occasionOuvrir dans une nouvelle fenetre - Mandataire AutoOuvrir dans une nouvelle fenetre

Bool | Olivier
Modérateur

Photo de Bool

Inscrit le : 09/05/2005

# Le 22/11/2008 à 19:28

Ceci fonctionnera un peu mieux (si tous les mots font au moins 4 lettres) :

$string = preg_replace('#([a-z0-9]{2})\.([a-z0-9]{2})#i', '$1 $2', $preg);


Idéalement il faudrait indiquer que la seconde expression (voir la première) ne "consomme" pas de caractères ; mais je ne me souviens jamais d'une fois à l'autre comment on fait ça

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

tonguide | Jeremy
Modérateur

 

Inscrit le : 09/05/2005

# Le 22/11/2008 à 19:34

AH oui ddpetit, t'as raison.

Par contre Bool, qu'est ce que tu veux dire par "ne consomme pas" .. ?
Parce que là, si tu retires les 2 virgules, ça fait strictement 2 caractères.

Fred | Frédéric
Modérateur

Photo de Fred

Inscrit le : 09/05/2005

# Le 22/11/2008 à 19:36

tonguide a dit :
[a-z0-9] remplace par [a-zA-Z0-9]


Avec l'option i, pas la peine a priori.
Par contre je comprends pas trop ta regex, pourquoi tu mets des 0-9 dans tes caractères autorisés alors que justement tu ne veux pas virer les points qui sont entourés de chiffres ? (si j'ai bien compris ton problème en tous cas)

Moi je ferais plutôt ça :

#([^0-9])\.([^0-9])#


De façon à ce que chaque caractère "." qui n'est pas entouré de chiffres soit remplacé par un espace.

"Le bois ne rend pas les coups"

Bool | Olivier
Modérateur

Photo de Bool

Inscrit le : 09/05/2005

# Le 22/11/2008 à 19:49

tonguide : le problème c'est que le "curseur" du parseur se déplace au fur et à mesure, ça donne :

1) début du traitement :

{CURSEUR}Gd.Espace.III.ABS Evo 2.2 dCi115 Expression

2) premier remplacement :
Gd Espace{CURSEUR}.III.ABS Evo 2.2 dCi115 Expression

3) le premier point ne peut donc pas correspondre au masque, il passe directement au second :
Gd Espace.III ABS{CURSEUR} Evo 2.2 dCi115 Expression



En limitant à deux caractères comme j'ai fait, on limite la casse, l'étape 2 devenant :
Gd Es{CURSEUR}pace.III.ABS Evo 2.2 dCi115 Expression

puis :
Gd Espace II{CURSEUR}I.ABS Evo 2.2 dCi115 Expression

mais là ça coince à nouveau et on obtient au final :
Gd Espace III.ABS Evo 2.2 dCi115 Expression



Il faudrait donc lui indiquer de ne pas "déplacer le curseur" pour la deuxième partie de la chaine. Certaines assertions simples telles que "\b" le permettent, mais pour le cas présent je ne sais pas comment le spécifier.


Sinon je plussois l'approche de Fred, qui me semble beaucoup plus simple.

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

ddpetit | Damien
Modérateur

Photo de ddpetit

Inscrit le : 03/05/2006

# Le 22/11/2008 à 19:50

En fait dans certains cas, je peux avoir des chiffres (ex: "207.CC 1.6 HDi110 Sport FAP"), ce qui est sur c'est dans le cas où j'ai x.x il faut laisser le point. Et c'est vrai que c'est assez compliqué également.

Loccasion.com - Vente de voitures d'occasionOuvrir dans une nouvelle fenetre - Mandataire AutoOuvrir dans une nouvelle fenetre

petitnuage | Sam
Membre

 

Inscrit le : 20/11/2008

# Le 25/11/2008 à 18:52

L'expression rationnelle serait donc celle-ci :


$r=preg_replace('#(?<!\b.)(\.)(?!.\b)#', ' ', $source);

pour supprimer le point partout, sauf si on a un caractère de chaque côté du point.

Documentation à relire :

Lookahead and Lookbehind Zero-Width AssertionsOuvrir dans une nouvelle fenetre

Outil pour tester :

Regular Expression Test ToolOuvrir dans une nouvelle fenetre

Alors, heureux ? :-D

Rano | Jean
Modérateur

Photo de Rano

Inscrit le : 13/04/2005

# Le 25/11/2008 à 19:06

petitnuage a dit :
pour supprimer le point partout, sauf si on a un caractère de chaque côté du point.
...
Alors, heureux ? :-D


Ce n'est pas ce qui était demandé

Chambres d'hote tavelOuvrir dans une nouvelle fenetre
Séjours en provenceOuvrir dans une nouvelle fenetre
Forum mariageOuvrir dans une nouvelle fenetre

petitnuage | Sam
Membre

 

Inscrit le : 20/11/2008

# Le 26/11/2008 à 00:02

Rano a dit :
petitnuage a dit :
pour supprimer le point partout, sauf si on a un caractère de chaque côté du point.
...
Alors, heureux ? :-D


Ce n'est pas ce qui était demandé


Ah bon ? Voici le cahier des charges :

ddpetit a dit :
Je me permets de relancer ce topic, j'ai un souci actuellement pour l'enregistrement de certaines données sur mon site. Certaines personnes placent dans leur logiciel des "." entre chaque mot de modèle. Exemple :
Gd.Espace.III.ABS Evo 2.2 dCi115 Expression
. Le problème est que j'aimerais enlever ces points sauf s'il de quelque chose du genre "x.x". En gros j'aimerais arriver à
Gd Espace III ABS Evo 2.2 dCi115 Expression
.

Voici ma requête :
$string = preg_replace('#([a-z0-9]{2,})\.([a-z0-9]{2,})#i', '$1 $2', $preg);


Résultat généré :
Gd Espace.III ABS Evo 2.2 dCi115 Expression


Il doit me manquer un tout petit quelque chose ...


Or, avec le code fourni ci-dessus, j'atteints le résultat attendu et je corresponds au cahier des charges. Où est mon erreur ?

Rano | Jean
Modérateur

Photo de Rano

Inscrit le : 13/04/2005

# Le 26/11/2008 à 00:08

Oui, c'est bon, c'est juste "caractère". Mais j'étais pas spécialement bien luné

Chambres d'hote tavelOuvrir dans une nouvelle fenetre
Séjours en provenceOuvrir dans une nouvelle fenetre
Forum mariageOuvrir dans une nouvelle fenetre

Julgates | Julien
Administrateur

Photo de Julgates

Inscrit le : 09/03/2005

# Le 26/11/2008 à 00:24

Rano a dit :
Oui, c'est bon, c'est juste "caractère". Mais j'étais pas spécialement bien luné

Ca c'était pas bien vu je te rassure

Pauvre martin ;-)

Shopping Time NetworkOuvrir dans une nouvelle fenetre - Founder / CTO

petitnuage | Sam
Membre

 

Inscrit le : 20/11/2008

# Le 26/11/2008 à 00:31

Pffff...

krucial | Jean Christophe
Administrateur

Photo de krucial

Inscrit le : 09/03/2005

# Le 03/06/2015 à 08:15

Salut

Une petite question

j'ai ceci comme regle :

$orig[] = "/(?<=.\W|\W.|^\W)" . preg_quote($smilies[$i]['code'], "/") . "(?=.\W|\W.|\W$)/";

Je ne pige pas ce que ca fait. Quelqu'un peut m'aider ?

C'est une regle pour transformer des codes en smiley dans phpbb, et cette regle fonctionne mal (certains smiley ne sont pas encodés), alors que

$orig[] = "/" . preg_quote($smilies[$i]['code'], "/") . "/";

Encode tres bien.

JC - Mes sitesOuvrir dans une nouvelle fenetre | Affiliation devis travauxOuvrir dans une nouvelle fenetre | Cotes voitures anciennesOuvrir dans une nouvelle fenetre

acti | Stéphane
Modérateur

Photo de acti

Inscrit le : 13/11/2005

# Le 03/06/2015 à 13:45

Hello JC,

(?<=...) permet de trouver un résultat si la position courante dans la chaîne est précédée par un résultat de ... qui se termine à la position courante (appelé : positive lookbehind assertion).
(?=...) permet de trouver un résultat si ... est trouvé, mais ne déplace pas le pointeur (appelée lookahead assertion).
\W permet de trouver n'importe quoi qui n'est pas un mot (non-word).
^ est utilisé pour marquer le début de quelque chose et $ la fin.
. remplace n'importe quel caractère.

En principe, tu as donc :
(?<=.\W|\W.|^\W) qui cherche tout caractère suivi d'un non-word, ou un non-word suivi de n'importe quel caractère (%, /, espace, ...), ou un non-word sans rien avant.
(?=.\W|\W.|\W$) qui cherche tout caractère suivi d'un non-word, ou un non-word suivi de n'importe quel caractère (%, /, espace, ...), ou un non-word sans rien après.

L'idée de la Regex à la base est de vérifier qu'on est pas au milieu d'un mot ou collé à un mot. Après, on peut sûrement améliorer les choses pour éviter certains problèmes que tu peux avoir.

J'espère que c'est clair

Stéphane

Stéphane

krucial | Jean Christophe
Administrateur

Photo de krucial

Inscrit le : 09/03/2005

# Le 03/06/2015 à 15:08

Ok merci ! Apres, je ne comprends pas bien pourquoi elle merde. Je vais contourner, c'est pas grave. Merci acti !

JC - Mes sitesOuvrir dans une nouvelle fenetre | Affiliation devis travauxOuvrir dans une nouvelle fenetre | Cotes voitures anciennesOuvrir dans une nouvelle fenetre

acti | Stéphane
Modérateur

Photo de acti

Inscrit le : 13/11/2005

# Le 03/06/2015 à 15:10

Quels sont les cas où tu as des problème JC ?

Stéphane

krucial | Jean Christophe
Administrateur

Photo de krucial

Inscrit le : 09/03/2005

# Le 03/06/2015 à 15:17

Bah, parfois, j'ai un simple texte, genre :

Ah c'est super !

:loul:


Le :loul: n'est plus transformé en smile. Je ne percute pas.

JC - Mes sitesOuvrir dans une nouvelle fenetre | Affiliation devis travauxOuvrir dans une nouvelle fenetre | Cotes voitures anciennesOuvrir dans une nouvelle fenetre

acti | Stéphane
Modérateur

Photo de acti

Inscrit le : 13/11/2005

# Le 03/06/2015 à 15:22

Et si tu mets un espace avant le premier double point et après le dernier double point du :loul: ça fonctionne non ?

Ta Regex n'est pas écrite pour réagir si le smiley est seul sans texte autour ou espacement.

Stéphane

tonguide | Jeremy
Modérateur

 

Inscrit le : 09/05/2005

# Le 03/06/2015 à 15:26

En gros, le fait de rajouter un pipeline | avant chaque fin de parenthèse devrait résoudre le soucis (c'est à dire "ou rien")

tonguide | Jeremy
Modérateur

 

Inscrit le : 09/05/2005

# Le 03/06/2015 à 15:33

Tiens : https://regex101.com/r/iH7kH0/1Ouvrir dans une nouvelle fenetre
Si tu as d'autres exemples de regex qui ne marche pas, mets-les là.

Répondre

Vous ne pouvez pas participer au forum, car votre inscription n'a pas été validée. Pour vous faire valider en tant que Membre, cliquez ici.

© MHN - Tous droits réservés | CNIL N°844440 | 28/03/2024 18:05:35 | Généré en 14.96ms | Contacts | Mentions légales |