[PHP] Aide sur expression reguliere (preg match)

perlimpinpin
Invité n'ayant pas de compte PHPfrance

30 nov. 2010, 19:33

Bonjour,

J'ai les valeurs suivantes dans un tableau que je souhaite nettoyer :

.
,
?
???
???????????
87+sss
X
AAAAAAAA
BBBBB
AAA BBBBB
AAA555AAA21
545AAA-5454
10-A4111


En gros je ne veux garder que les chaines qui :
- contiennent au minimum une lettre et un chiffre (mais pas l'un sans l'autre)
- dont la longueur est strictement supérieure à 1 caractère
- qui ne contiennent pas d'espace, ni de caractères spéciaux (type tabulation, retour chariot, etc.)

Les trois derniers de la liste doivent matcher.

Merci de votre aide.

devlop78
Invité n'ayant pas de compte PHPfrance

30 nov. 2010, 20:04

/^[a-z0-9]*(([0-9][a-z])|([a-z][0-9]))[a-z0-9]*$/i

je dirais ... mais c'est cra cra quand meme

perlimpimpim
Invité n'ayant pas de compte PHPfrance

01 déc. 2010, 10:26

Merci !

Mais les deux derniers ne matchent pas :(

545AAA-5454
10-A4111

La chaîne doit contenir au moins une lettre ET un chiffre et peut contenir un / ou un -

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

01 déc. 2010, 10:50

essai avec /[a-z0-9]*(([0-9][a-z])|([a-z][0-9]))[a-z0-9]/gi ?

tu peut tester avec http://gskinner.com/RegExr/ (indiqué par devlop78)

@+
Il en faut peu pour être heureux ......

perlimpimpim
Invité n'ayant pas de compte PHPfrance

01 déc. 2010, 11:30

Le /g fait gueuler mon php

preg_match() [<a href='function.preg-match'>function.preg-match</a>]: Unknown modifier 'g'

Pour simplifier :

- la chaîne doit contenir une lettre et un chiffre ou que des chiffres (mais pas que des lettres)
- la chaîne doit contenir plus de 1 caractère
- la chaîne peut contenir un ou plusieurs espaces, un tiret (-) ou un slash (/) n'importe où

J'ai déjà essayé avec l'url donnée mais ça ne fonctionne pas, la regexp doit être trop compliquée.

ViPHP
ViPHP | 5462 Messages

01 déc. 2010, 11:48

le g c'est une option flash :wink:

devlop78
Invité n'ayant pas de compte PHPfrance

01 déc. 2010, 15:00

Oui là c'est moins évident

/^[a-z0-9]*(([0-9][a-z])|([a-z][0-9]))[a-z0-9]*$/i

Peut etre alors

/^[a-z0-9\-]*(([0-9][\-\\]*[a-z])|([a-z][\-\\]*[0-9]))[a-z0-9\-]*$/i

???

perlimpimpin
Invité n'ayant pas de compte PHPfrance

01 déc. 2010, 15:30

Franchement bravo, je n'y pige rien mais bravo, tu y es presque !

Reste ces chaines qui sont exclues par la regexp et que je souhaite garder :

1319469
109625772
1021011724
1220400112/AC
1370401226/AD
50077601147
50077601147

devlop78
Invité n'ayant pas de compte PHPfrance

01 déc. 2010, 20:14

Bah c'est toi qui n'est pas logique, tu définis des règles et tu les changes :
contiennent au minimum une lettre et un chiffre (mais pas l'un sans l'autre)
Evidemment "1319469" ne répond pas à ce critère ...

Par contre pour "1220400112/AC", c'est moi j'ai autorisé les \ au lieu des / ... lol


/^[a-z0-9\-]*(([0-9][\-\/]*[a-z])|([a-z][\-\/]*[0-9]))[a-z0-9\-]*$/i

Mais ça se trouve on peut le réduire deux fois ... je ne suis pas expert en expression régulière ... je réfléchis c'est tout ...

perlimpimpim
Invité n'ayant pas de compte PHPfrance

02 déc. 2010, 11:05

Merci c'est du bon boulot, moi je ne capte rien. J'avais oublié un cas, désolé.

Il s'agit bien de contenir une lettre et un chiffre ou au moins 2 chiffres.

J'ai changé les règles car je pensais te faciliter la tache ;)

Autrement, peut-être est-ce plus simple en matchant les données à exclure puis à inverser le preg match ? Les conditions semblent plus simples :

- la chaîne ne contient pas de chiffre
- la chaîne peut contenir au moins une fois le caractère + ou _ ou ? . ou ,

perlimpinpim
Invité n'ayant pas de compte PHPfrance

06 déc. 2010, 12:13

un petit up, on y est presque ! ;)