Les expressions régulières de PHP sont au format PCRE (Perl Common Regular Expressions) '/r/' où r est une expression de la forme:
r ::= a (un caractère)
| . (n'importe quel caractère)
| r1 | r2 (r1 ou r2)
| r? (r répétée au plus 1 fois)
| r* (r répétée 0 fois ou plus)
| r+ (r répétée 1 fois ou plus)
| [c1 … cn] (un caractère parmis c1, …, cn)
| [c1-cn] (un caractère parmis c1, …, cn)
| [^c1 … cn] (un caractère sauf c1, …, cn)
| [^c1-cn] (un caractère sauf c1, …, cn)
| ^ (début de texte)
| $ (fin de texte)
| (r) (r elle même)
preg_match($regexp, $chaine)
renvoie 1 si une sous-chaine de $chaine
correspond à $regexp, 0 si aucune sous-chaine ne correspond
et FALSE en cas de problème (attention,
utiliser === pour tester le résultat).
<?php
$chaine = "ABCDEFABCDEF";
echo preg_match('/ABC/', $chaine); // affiche 1
echo preg_match('/DEF/', $chaine); // affiche 1
echo preg_match('/^ABC/', $chaine); // affiche 1
echo preg_match('/^DEF/', $chaine); // affiche 0
echo preg_match('/ABC$/', $chaine); // affiche 0
echo preg_match('/DEF$/', $chaine); // affiche 1
echo preg_match('/(ABC...)+/', $chaine); // affiche 1
echo preg_match('/[^A-Z]+/', $chaine); // affiche 0
echo preg_match('/[^A-Z]*/', $chaine); // affiche 1 !
echo preg_match('/^[^A-Z]*$/', $chaine); // affiche 0
?>
preg_replace($regexp, $motif, $chaine)
recherche toutes les sous-chaînes de $chaine reconnues par $regexp et les remplace par $motif. Ce dernier peut contenir $i pour référencer le ième groupe de parenthèses
<?php
$chaine = "10-31-1981";
$reg1 = "/([0-9]+)-([0-9]+)-([0-9]+)/";
echo preg_replace($reg1, "$2/$1/$3", $chaine);
// affiche 31/10/1981
$reg2 = "/1/";
echo preg_replace($reg2, "toto", $chaine);
// affiche toto0-3toto-toto98toto
$reg3 = "/[0-9]([0-9]*)/"
echo preg_replace($reg3, "$1", $chaine);
// affiche 0-1-981 (* déplie la regexp le plus possible)
?>
preg_split($regexp, $chaine)
renvoie un tableau des sous-chaine de $chaine séparées par $motif (équivalent à explode pour des $regexp constantes).
<?php
$chaine = "Une phrase, c'est plusieurs mots.";
print_r (preg_split("/[ ,.']+/", $chaine));
//Affiche:
//Array ( [0] => Une [1] => phrase [2] => c [3] => est
// [4] => plusieurs [5] => mots [6] => )
?>
preg_match_all($regexp, $chaine, &$resultat)
&$resultat est un tableau passé par référence. Après l'appel, $resultat[0] contient un tableau avec toutes les sous-chaines reconnues et $resultat[i] contient tous les résultats reconnus par le ième groupe de parenthèses. Renvoie le nombre de chaines trouvées (i.e. la longueur de $resultat[0]).
<?php
$res = array();
$chaine = "ABC ACD AEF AB DEF";
echo preg_match_all("/A([A-Z]*)/", $chaine, $res);
//Affiche 4
print_r ($res);
/*Affiche
Array ( [0] =>
Array ( [0] => ABC [1] => ACD [2] => AEF [4] => AB)
[1] =>
Array ( [0] => BC [1] => CD [2] => EF [4] => B)
)
*/?>
On utilise la méthode post pour les formulaires. Les valeurs sont envoyées dans la requête HTTP (et non pas encodées dans l'URL)
<form action="cible.php" method="post"
enctype="multipart/form-data">
<input type="file" name="fichier" size="20"/>
<button type="sumbit">Uploader le fichier</button>
</form>
Apperçu:
Coté serveur, la variable $_FILES est
définie. $_FILES["fichier"] contient un
tableau avec des informations sur le fichier envoyé. Les autres
champs (par exemple valeur d'un champ texte) sont stockés dans la
variable $_POST (au lieu de $_GET).
Étant donné un formulaire avec un champ input de type file et de nom "fichier" on a accès aux information suivantes:
fopen($nomfichier, $mode)
Ouvre un fichier dont on donne le nom avec un mode particulier. Les modes sont: "r" (lecture), "r+" (lecture/écriture), "w" (écriture), "w+" (lecture/écriture, création si non-existant), "a" (écriture, ajout à la fin si existant), "a+" (lecture/écriture, création si non-existant, ajout à la fin si existant). fopen renvoie un descripteur de fichier que l'on peut utiliser pour manipuler le fichier.
. fread($desc, $taille)
Lit au maximum $taille caractères dans un fichier dont le descripteur (renvoyé par fopen) est $desc. La fonction renvoie un chaine d'au plus $taille caractères ou FALSE en cas d'erreur.
fwrite($desc, $chaine)
Écrit la chaine de caractères à la position courante dans le fichier dont le descripteur est $desc. Renvoi le nombre d'octets écrits ou FALSE en cas d'erreur.
fclose($desc)
Ferme le fichier dont le descripteur est $desc
fseek($desc, $offset, $orig)
Déplace le pointeur interne de position du fichier dont le descripteur est $desc de $offset octets. Le paramètre $orig donne l'origine: SEEK_CUR (décalage à partir de la position courante), SEEK_SET (position absolue dans le fichier), SEEK_END (décalage à partir de la fin de fichier).
file_get_contents($nomfichier)
Ouvre un fichier dont on donne le nom et renvoie son contenu sous forme d'une chaine de caractères
file($nomfichier)
Renvoie un tableau avec une case par ligne dans le fichier. Chaque entrée contient le "\n" terminal.
GET /~kn/index.html HTTP/1.1
Host: www.lri.fr
HTTP/1.1 200 OK
Server: nginx/1.4.1 (Ubuntu)
Date: Sun, 17 Nov 2013 16:44:48 GMT
Content-Type: text/html
Content-Length: 2038
Homepage
…
]]>
} ← code de retour
} ← type de contenu
} ← longueur du contenu
} ← contenu (2038 octets)
GET /~kn/fichier.pdf HTTP/1.1
Host: www.lri.fr
HTTP/1.1 200 OK
Server: nginx/1.4.1 (Ubuntu)
Date: Sun, 17 Nov 2013 16:44:48 GMT
Content-Type: application/pdf
Content-Length: 103449
>
stream
………
]]>
Fichier notes_csv.php:
<?php
header('Content-type: application/csv');
header('Content-Disposition: attachement; filename="notes.csv"');
echo "Nom, Note\n";
foreach ($NOTES as $nom => $note)
echo $nom . ", " . $note . "\n";
?>
⚠ Attention!
En tête utilisés par le serveur dans ses réponses
En tête utilisés par le client dans ses requêtes
On rappelle que HTTP est un protocole stateless (sans état, i.e. le serveur Web ne conserve pas d'information entre les connexions). Quel problème cela pose-t-il ?
⇒ difficle de réaliser une « application » moderne répartie sur plusieurs pages
Un cookie est un paquet de données envoyé par le serveur, stocké par le client (navigateur Web) et renvoyé au serveur lors d'une nouvelle connexion. Les propriétés d'un cookie sont:
⚠ Attention! seul le domaine qui a déposé le cookie est capable de le relire
Créer ou mettre à jour un cookie sur le client:
setcookie($nom, $val, $date);
(on peut récupérer le nombre de secondes depuis epoch avec
la fonction time()).
Exemple:
setcookie("mon_cookie", "42", time() + 3600 * 24 * 30);
Représenter le temps (une date) dans un programme informatique est quelque chose de compliqué. Quels problèmes cela pose-t-il ?
Ce n'est pas encore quelque chose de bien maîtrisé !
On peut récupérer la valeur d'un cookie depuis PHP:
$_COOKIE["mon_cookie"]
Un cookie "foo" existe (i.e. a été défini auparavant) si une entrée correspondante existe dans le tableau global $_COOKIE. On peut tester qu'une entrée existe dans un tableau avec isset().
⚠ Attention!
Une session HTTP est un ensemble de requêtes/réponses HTTP
entre un serveur et un même client.
Exemple d'un sondage en ligne:
Pour programmer une application Web, on souhaîte avoir accès à des variables de session c'est à dire des variables qui sont:
Les variables de sessions sont donc propres à chaque client et persistent le temp de la session (le temps de session est décidé par le serveur)
On initie une session avec la fonction:
session_start();
Une fois appelée, la variable $_SESSION contient un tableau que l'on peut utiliser entre plusieurs pages. Les valeurs contenues dans le tableau persistent jusqu'à la fin de la session. Une session se termine:
⚠ Attention! session_start() doit être appelé avant le premier echo du fichier.
<?php /* Fichier page1.php */
session_start();
$_SESSION["Valeur"] = 42;
?>
Veuillez cliquer sur le "page2.php"lien
]]>
La valeur est echo $_SESSION["Valeur"];