Question sur different point en php

Petit nouveau ! | 2 Messages

28 mai 2007, 01:35

Bonjour ou bonsoir selon à quel heure vous me lirez :).

Voila j'ai découvert ce tutorial sur php france ici, qui montre comment réaliser deux liste déroulante liée.
Comme je débute en php, j'ai donc éssailler de m'exercer et tout fonctionne pour le mieux, je n'ai aucun problème de fonctionnement.
J'ai juste quelque question sur differente ligne de code dans la méthode php.

Tout d'abord cette ligne, elle se trouve tout en haut du code juste en dessous des variables de connection

Code : Tout sélectionner

$idr = isset($_POST['region'])?$_POST['region']:null;
Je ne comprend pas ce que fait ce (?), même si j'ai l'impression que sa remplace un if, si le $_POST['region'] n'est pas affecté il prend null. M'enfin je ne suis pas sur de ce que j'avance...



Ensuite cette ligne se trouve dans le premier for que vous verrez dans le code, un peu après la premiere requete.

Code : Tout sélectionner

<option value="<?php echo($code_region[$i]); ?>"<?php echo((isset($idr) && $idr == $code_region[$i])?" selected=\"selected\"":null); ?>><?php echo($region[$i]); ?></option>
Ici j'ai un soucis toujours avec le (?) puis avec selected. Je ne comprend pas ce que fait un selected entre deux \ puis un null juste à coté comme sa. J'ai juste compris que sa servait à garder la séléction dans la liste déroulante car j'ai testé en l'enlevant mais j'aimerais juste comprendre comment marche exactement cette histoire de selected.



Une derniere chose, j'ai trouvé ce code pour vérifié la validé d'un email :

Code : Tout sélectionner

$email = $_POST['email']; $atom = '[-a-z0-9!#$%&\'*+\\/=?^_`{|}~]'; // caractères autorisés avant l'arobase $domain = '([a-z0-9]([-a-z0-9]*[a-z0-9]+)?)'; // caractères autorisés après l'arobase (nom de domaine) $regex = '/^' . $atom . '+' . // Une ou plusieurs fois les caractères autorisés avant l'arobase '(\.' . $atom . '+)*' . // Suivis par zéro point ou plus // séparés par des caractères autorisés avant l'arobase '@' . // Suivis d'un arobase '(' . $domain . '{1,63}\.)+' . // Suivis par 1 à 63 caractères autorisés pour le nom de domaine // séparés par des points $domain . '{2,63}$/i'; // Suivi de 2 à 63 caractères autorisés pour le nom de domaine // test de l'adresse e-mail if (preg_match($regex, $email) { etc... }
j'aimerais si possible qu'on m'explique, pourquoi il y a plusieurs fois le même caractère dans $atom et dans $domaine. Pourquoi dans regex il y a des /, ^ et autre partout, il n'y a que les points dont j'ai compris à quoi ils servent enfin je pense..
Et pour finir ce que fais au juste la fonction preg_match. En faite je crois qu'il me faudrait une explication complete de ce truc :lol: .

Enfin voila j'ai bien essailler de chercher des trucs sur le net pour essailler de comprendre mais je n'ai rien trouvé de vraiment utile pour m'aider à comprendre.
Je n'ai trouvé qu'une seul chose sur preg_ match sur le site manuelphp mais j'avouerais qu'une explication supplémentaire m'aiderait surement mieux que leur exemple..
Je pense ne pas avoir bien compris l'utilité des \ et /, suivi de lettre ou non.



Enfin voila j'espere ne pas avoir été trop long et être assez clair dans mes explications.
D'avance je vous remercie pour vos réponses :D

ViPHP
ViPHP | 5924 Messages

28 mai 2007, 02:51

Bonjour ou bonsoir selon à quel heure vous me lirez :).
Ce sera bonsoir alors :)
J'ai juste quelque question sur differente ligne de code dans la méthode php.
C'est rare de voir des gens qui essayent de comprendre les codes, même lorsqu'ils fonctionnent, c'est tout à ton honneur. Je vais commencer, il y a beaucoup à dire.

Code : Tout sélectionner

$idr = isset($_POST['region'])?$_POST['region']:null;
Je ne comprend pas ce que fait ce (?), même si j'ai l'impression que sa remplace un if, si le $_POST['region'] n'est pas affecté il prend null. M'enfin je ne suis pas sur de ce que j'avance...
Tu as visé juste, ca s'appelle l'opérateur ternaire, il est très pratique et assez utilisé en programmation dans pas mal de langages. Tu peux voir la documentation PHP de cet opérateur sur cette page.

Ensuite cette ligne se trouve dans le premier for que vous verrez dans le code, un peu après la premiere requete.

Code : Tout sélectionner

<option value="<?php echo($code_region[$i]); ?>"<?php echo((isset($idr) && $idr == $code_region[$i])?" selected="selected"":null); ?>><?php echo($region[$i]); ?></option>
Ici j'ai un soucis toujours avec le (?) puis avec selected. Je ne comprend pas ce que fait un selected entre deux \ puis un null juste à coté comme sa. J'ai juste compris que sa servait à garder la séléction dans la liste déroulante car j'ai testé en l'enlevant mais j'aimerais juste comprendre comment marche exactement cette histoire de selected.
Concernant les \, ils sont nécessaires pour empécher l'interprétation du caractère " comme un caractère de fin de chaine. Si tu regardes bien, la chaine commence et se finit par un ", donc si tu veux mettre un guillemet dans ta chaine, tu es bloqué puisqu'il va être interprété comme une fin de chaine, d'où le caractère d'échappement \ qui signale à php que le caractère fait partie de la chaine. L'échappement sert aussi à moult autres usages.

Concernant le selected, il indique au navigateur quel élément de la liste est sélectionné par défaut. Par exemple, lorsque tu as une liste machin1, machin2, machin3, ton navigateur n'est pas sensé savoir lequel choisir par défaut. Lors du chargement de la page, il recherchera donc l'élément qui aura 'selected="selected"'.
NB : Ca marche aussi avec seulement 'selected' mais ce n'est pas correct vis à vis des dernières normes, c'est pour ca qu'on met 'selected="selected"'.

Une derniere chose, j'ai trouvé ce code pour vérifié la validé d'un email :

Code : Tout sélectionner

$email = $_POST['email']; $atom = '[-a-z0-9!#$%&\'*+\\/=?^_`{|}~]'; // caractères autorisés avant l'arobase $domain = '([a-z0-9]([-a-z0-9]*[a-z0-9]+)?)'; // caractères autorisés après l'arobase (nom de domaine) $regex = '/^' . $atom . '+' . // Une ou plusieurs fois les caractères autorisés avant l'arobase '(\.' . $atom . '+)*' . // Suivis par zéro point ou plus // séparés par des caractères autorisés avant l'arobase '@' . // Suivis d'un arobase '(' . $domain . '{1,63}\.)+' . // Suivis par 1 à 63 caractères autorisés pour le nom de domaine // séparés par des points $domain . '{2,63}$/i'; // Suivi de 2 à 63 caractères autorisés pour le nom de domaine // test de l'adresse e-mail if (preg_match($regex, $email) { etc... }
j'aimerais si possible qu'on m'explique, pourquoi il y a plusieurs fois le même caractère dans $atom et dans $domaine. Pourquoi dans regex il y a des /, ^ et autre partout, il n'y a que les points dont j'ai compris à quoi ils servent enfin je pense..
Et pour finir ce que fais au juste la fonction preg_match. En faite je crois qu'il me faudrait une explication complete de ce truc :lol: .

Enfin voila j'ai bien essailler de chercher des trucs sur le net pour essailler de comprendre mais je n'ai rien trouvé de vraiment utile pour m'aider à comprendre.
Je n'ai trouvé qu'une seul chose sur preg_ match sur le site manuelphp mais j'avouerais qu'une explication supplémentaire m'aiderait surement mieux que leur exemple..
Je pense ne pas avoir bien compris l'utilité des \ et /, suivi de lettre ou non.
Tu soulèves un point complexe, les expressions régulières. J'ai personnellement mis du temps avant de vraiment bien les comprendre et les maîtriser, car ce sont des outils très utiles et très puissants, mais difficiles à maîtriser. Je vais t'expliquer chacun des détails de l'expression régulière que l'on a ici.

Ici, le problème a été simplifié par celui qui a fait le tutoriel, puisque l'expression régulière a été décomposée :
$atom   = '[-a-z0-9!#$%&\'*+\\/=?^_`{|}~]';  // caractères autorisés avant l'arobase
Ici, on a défini une classe de caractères, c'est à dire une liste de caractères, lorsque l'analyseur passe par ici, il vérifie que le caractère qu'il a à vérifier est dans cette liste. Dans cette liste, on a dans l'ordre :
Les tirets : '-'
Les lettres : 'a-z' (signifie que le caractère peut se situer entre a et z)
Les chiffres : '0-9' (idem)
...
Les guillemets simples : '\'' (Ici le \ est un caractère d'échappement comme tout à l'heure)
...
Les anti slash : '\\' (Ici, on échappe le caractère d'échappement pour qu'il ne soit pas interprété comme un caractère d'échappement)
...
$domain = '([a-z0-9]([-a-z0-9]*[a-z0-9]+)?)'; // caractères autorisés après l'arobase 
Ici, c'est un peu plus compliqué, on a fait des sous masques définis par des parenthèses :
On a encore [a-z0-9] qui comme tout à l'heure définit une classe de caractères, qui ici ne comprend que les caractères alphanumériques.
([a-z0-9]([-a-z0-9]*[a-z0-9]+)?) : Le premier caractère est un caractère alphanumérique.
([a-z0-9]([-a-z0-9]*[a-z0-9]+)?) : Ici, le point d'interrogation dit que ce sous masque est optionnel, c'est à dire que s'il n'y a qu'un seul caractère, il l'ignore, sinon, il le lit pour vérifier que la chaine vérifie notre expression :
([-a-z0-9]*[a-z0-9]+) : Il doit y avoir 0 ou plus (étoile veut dire 0 ou plus) caractères alphanumériques ou tirets.
([-a-z0-9]*[a-z0-9]+) : Il doit ensuite y avoir 1 ou plus (le plus désigne un ou plus) caractères alphanumériques.

Un exemple de chaines vérifiant ces expressions :
'([a-z0-9]([-a-z0-9]*[a-z0-9]+)?)
ab-b-b-bcdggfj
ab
a

Et maintenant on met tout ensemble :
 $regex = '/^' . $atom . '+' .   // Une ou plusieurs fois les caractères autorisés avant l'arobase
                  '(\.' . $atom . '+)*' .         // Suivis par zéro point ou plus
                                                  // séparés par des caractères autorisés avant l'arobase
                  '@' .                           // Suivis d'un arobase
                  '(' . $domain . '{1,63}\.)+' .  // Suivis par 1 à 63 caractères autorisés pour le nom de domaine
                                                  // séparés par des points
                  $domain . '{2,63}$/i';          // Suivi de 2 à 63 caractères autorisés pour le nom de domaine
Il y a '/' en début et en fin d'expression régulière, c'est le caractère qui sert à délimiter l'expression, et le i tout à la fin sert à dire que l'expression est insensible à la casse. {1, 63} désigne le fait qu'on peut mettre 1 à 63 fois le caractère, le sous masque, ou la classe de caractères.
Le reste est déjà commenté.

J'espère que c'est clair pour les expressions régulières, c'est vrai que c'est dur à expliquer.
Enfin voila j'espere ne pas avoir été trop long et être assez clair dans mes explications.
Moi de même :)
D'avance je vous remercie pour vos réponses :D
De rien. :)

Mammouth du PHP | 991 Messages

28 mai 2007, 09:40

Superbe reponse ^^

Pour les expression réguliere tu peux visiter le site du zero tres bien documenter un peu plus clair que notre cher Sékiltoyai

le siteduzero : Lien
le cours sur les regex => expression réguliere : Lien

@+ thehawk
DevOps, Symfony4, Hoa

Petit nouveau ! | 2 Messages

28 mai 2007, 19:38

Merci à tous les deux pour vos réponses, et surtout à Sékiltoyai qui à du prendre du temps pour me répondre. J'ai mieux compris certains point. Appart quelque petites chose sur les expressions régulière, qui m'a foi comme l'a dit Sékiltoyai, est assez complexe comme chose :D. C'est surtout le $domaine dont j'ai un peu de mal mais c'est pas grave je vais essailler de me renseigner d'avantage grace aux differents liens que vous m'avez laisser. Merci encore.

ViPHP
ViPHP | 5924 Messages

28 mai 2007, 20:34

De rien, bonne lecture :)

Petit nouveau ! | 2 Messages

28 mai 2007, 21:28

... je vois pas le rapport mais merci quand meme !!!