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
Réponse acceptée

Bonjour,
Essaye ça:

if ((strlen($id) <> 18) || (!in_array(substr($id, 0,1) , array("S","T"))) {
skp
Réponse acceptée

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
}
tleb
Réponse acceptée

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
}

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

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

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.

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

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

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

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

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

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.

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

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).

@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.

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] ?

  • 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...)