Pb de conditions

Par Frank Hélin, il y a 11 ans


Bonjour,

Je ne trouve pas comment faire tourner cette simple condition :
Si $id n'a pas une longueur strictement = à 18 OU si le premier caractère n'est pas un 'P' ou un 'V' alors...
J'ai écris ça :

if ((strlen($id) <> 18) || (substr($id, 0,1) !== "S" or "T")) {
echo $a . 'erreur !';   }   else{}

Ce qui ne fonctionne pas c'est la deuxième condition avec S et T.

Merci !

17 réponses

Tackacoder, il y a 11 ans

Bonjour,
Essaye ça:

if ((strlen($id) <> 18) || (!in_array(substr($id, 0,1) , array("S","T"))) {
Frank Hélin, il y a 11 ans

Oups, il se produit l'inverse du résultat escompté ! :-)

skp, il y a 11 ans

Bonjour, la première lettre de ton $id est bien en majuscule ?

Frank Hélin, il y a 11 ans

Oui, oui, en majuscule. Ce que tu m'as donné fait l'inverse de ce que je souhaite. C.a.d que si la première lettre de la chaine $id commence par S ou T, cela renvoi erreur ! Hors, ce sont les deux seules lettres autorisées.

Carouge10, il y a 11 ans

Il suffit d'enlever le ! devant in_array pour faire l'inverse

tleb, il y a 11 ans

Il suffit de mettre echo 'erreur'; dans le else { ... }.

Frank Hélin, il y a 11 ans

Oups, je n'avais pas vu le ! Je l'aurai enlevé autrement ;-) Merci.

Frank Hélin, il y a 11 ans

Donc, il vaut mieux au contraire que je l'ajoute si je veux que ça fonctionne

skp, il y a 11 ans

J'ai peut-être mal compris ta demande mais normalement :

if(strlen($id) != 18 || !in_array(substr($id, 0, 1), array("S", "T"))) { //ton code en cas d'erreur } else { //ton code si c'est correct }
hugopb82, il y a 11 ans

Normalement oui, la condition que tu as écrite (sans le !) est l'inverse de ce que tu veux faire

tleb, il y a 11 ans

Pourquoi se compliquer la vie ?

if(strlen($id) == 18 || in_array(substr($id, 0, 1), array("S", "T"))) {
    //ton code si c'est correct
}
else {
    //ton code en cas d'erreur
}
Frank Hélin, il y a 11 ans

En effet, ça fonctionne. Ce n'était qu'à cause de ! que je n'avais pas vu et de ma méconnaissance de la fonction in_array. D'ailleurs, très utile. MErci à vous.

skp, il y a 11 ans

Pour la solution à @Forever il faut remplacer le OU par un ET.

tleb, il y a 11 ans

On pourrait encore simplifier en utilisant la nouvelle façon pour déclarer un array :

['S', 'T']

Je trouve sa plus agréable, personnellement (surtout que array() est trompeur, parce que ce n'est pas une fonction).

Carouge10, il y a 11 ans

@forever : Certe est elle plus "agréable", il faut quand même s'en méfier car suivant les serveur, elle n'est pas encore prise en compte partout.

Frank Hélin, il y a 11 ans

Oui, en effet ça fonctionne. Petit complèment d'info svp, comment faire pour spécifier p et P sans taper...p et P (maj. min.) Mieux, comment faire si je veux spécifier des lettres allant de a à z par exemple, comme avec les regex [a-bA-B] ?

tleb, il y a 11 ans
  • in_array(strtoupper(substr($id, 0, 1)), array("S", "T")) Utilise mb_strtoupper() si tu utilises des charactères spéciaux. Tu pourrais aussi utiliser strtolower() ;
  • preg_match.

(faudrait que tu cherches un peu aussi...)