J'ai représenté ici les fonctions de chaînes qui me paraissent les plus intéressantes/courantes. Il y en a bien d'autres non documentées ici, comme par exemple des fonctions de comparaison phonétiques telles que soundex, similar_text ou strnatcasecmp (tri naturel), ou de manipulation de chaînes de caractères HTML ou issues du langage C, comme strip_tags, htmlspecialchars ou stripCslashes, ou découpage d'une chaîne en segments avec strok. Référence externe : Toutes les fonctions de chaînes de caractères se trouvent ici
La plupart des fonctions de texte sont case sensitive : c'est à dire
qu'elles font bien la distinction entre les majuscules et les minuscules. Certaines
fonctions ont leur pendant case insensitive; C'est le cas de ereg et eregi.On
les reconnait par le fait d'un i de insensitive ajouté dans le nom de
la fonction. Par contre, d'autres fonctions ne sont QUE case sensitive. Dans
le cas ou on désire les utiliser sans tenir compte des majuscules et
des minuscules, on peut recourir à la fonction tolower
qui convertit automatiquement une chaîne de caractère en minuscule.
Exemple avec la fonction substr_count
: (Comptage d'une occurrence de texte dans une autre)
print substr_count("abcABCaBCabc",
"abc");
Affiche 2, tandis que
print substr_count(tolower("abcABCaBCabc"),
"abc");
Affiche 4 !
On peut très bien accéder aux différents caractères d'une chaîne de cette manière :
$LaChaine = "abcdefgh";
echo $LaChaine[3];
Va afficher d, car c'est le 0 , 1 , 2 , 3ème caractère de la chaîne (Bien sûr, $LaChaine[100] renverra rien comme résultat)
MAIS AUSSI :
strrev
- permet d'inverser une chaîne
urlencode et urldecode : pour remplacer les caractères
spéciaux par leur équivalent HTML lisisble dans une URL
stripslashes
- permet d'enlever les \
str_repeat -
permet de répéter une même chaîne un certain nombre
de fois : echo str_repeat("Oulala",20);
D'une façon globale, les comparaisons entre chaînes sont case-sensitive.
echo strcmp("Dupont"
, "Dupond"); // >0
(ici : 1)
echo strcmp("Dupond"
, "Dupont"); // <0
(ici : -1)
echo strcmp("Dupond"
, "Dupond"); // 0
echo strcmp("Dupond"
, "DUPOND"); // >0
(ici : 1)
echo strcmp("123" , 123); // 0
if ("Dupond" == "Dupond")
// Oui
echo "Dupond == Dupond";
if ("Dupond" == "DUPOND")
// Non
echo "Dupond == DUPOND";
Il peut être parfois intéressant de ne pas comparer 2 chaînes complètes, mais seulement les premiers caractères. Comparons les célèbres Dupont et Dupond :
123456 123456
echo strncasecmp("Dupont"
, "Dupond"
, 5); // 0
echo strncasecmp("Dupont"
, "Dupond"
, 6); // >0 (16
dans cet exemple)
echo strncasecmp("Dupond"
, "Dupont"
, 6); // <0 (-16
dans cet exemple)
ereg est une fonction strictement identique à eregi, sauf que eregi est insensible à la casse.
Soit la chaîne de texte à récupérer entre ananas et cacahuète dans la chaîne "J'aime les fuits : ananas banane cacahuète" :
$Texte = eregi
("ananas(.*)cacahuète"
, "J'aime les fuits : ananas banane cacahuète"
, $Resultat);
echo $Resultat[1];
3 paramètres sont nécessaires à la bonne marche de notre entreprise :
"ananas(.*)cacahuète": Nous cherchons tout ce qui se trouve dans ananas et cacahuète
"J'aime les fuits : ananas banane cacahuète": Chaîne de caractères dans laquelle nous allons fouiller
$Resultat: est un tableau. Dans la case 1 de ce tableau se nichera le résultat de notre demande. Dans notre cas : banane
eregi ("aaa(.*)ccc" , "cccbbbaaa" , $Resultat);
Bien que dans l'exemple suivant, il y a 2 endroits qui sont bordés par aa et cc :
eregi ("aa(.*)cc"
, "aabbcc
- aaXXcc"
, $Resultat);
echo $Resultat[1];
Le résultat sera sans équivoque :
bbcc - aaXX
Et ce n'est pas la peine d'aller voir $Resultat[2], il est de toute façon vide.
On peut rechercher des intervalles de caractères :
eregi ("[a-d](.*)z"
, "dabXXXzYYzY"
, $Stockage);
echo $Stockage[1];
Affichera
abXXXzYY
Parce que l'intervalle de a à d précise que la première des lettres valides rencontrées fait foi : le "d" est bon, donc, en avant la musique jusqu'au dernier z qu'on rencontre
eregi ("(.*)F"
, "abcdefghijkl" , $Stockage);
echo $Stockage[1];
Renverra abcde
Pour rechercher tout de qui se trouve après quelque chose, c'est exactemet l'inverse :
eregi ("F(.*)"
, "abcdefghijkl" , $Stockage);
echo $Stockage[1];
Renverra ghijkl
echo chr(65)
Affiche A
echo ord("A")
Affiche 65
Fonction utile quand on a une chaîne de caractère qui est en fait une suite d'éléments séparés par un signe ou plusieurs
$Pizza = "Oignons--Fromage--Tomate";
$Garniture = explode("--",
$Pizza);
echo $Garniture[0] , "<BR>"; // Oignons
echo $Garniture[1] , "<BR>"; // Fromage
echo $Garniture[2] , "<BR>"; // Tomate
echo $Garniture[3] , "<BR>"; // Rien
$MonTableau = array('A',
'B', '442');
$Chaine = implode(";",
$MonTableau);
echo $Chaine; // A;B;442
quotemeta retourne la chaîne str après avoir introduit un anti-slash (\) devant tous les caractères suivants :
. \\ +
* ? [ ^ ] ( $ )
echo quotemeta("4+3=8?") // 4\+3=8\?
11111111112
12345678901234567890
print str_pad("Michel",
20, "123", STR_PAD_RIGHT); //
Michel12312312312312
print str_pad("Michel", 20, "123", STR_PAD_LEFT);
// 12312312312312Michel
print str_pad("Michel", 20, "123", STR_PAD_BOTH);
// 12Michel12
$UneChaine = "abcaBcABC";
$UneChaine = str_replace("AB",
"X", $UneChaine);
echo $UneChaine; // abcaBcXC
strtr remplace des occurrences d'un seul caractère, mais une seule instruction est très pratique pour remplacer d'un seul coup tous les caractères invalides ou accentués par exemple :
$chaine="père
noël et oeufs de pâques";
echo strtr($chaine, "èëâ",
"eea");
Donne
pere noel et oeufs de paques
$UneChaine = "abcABCabcABCabc";
$LeDernierBout = strstr($UneChaine, "BC");
print $LeDernierBout; // BCabcABCabc
Cette fonction recherche les caractères communs du premier argument dans le 2ème, jusqu'au moment ou il trouve un caractère pas en commun.
Premier exemple : Le résultat est 0 car le premier caractère (X) est carrément absent du 2ème argument
echo strspn("X2345", "1234567890"); // 0
Deuxième exemple : Même dans le désordre, les 4 premiers caractères (7539) sont présents dans le 2ème argument, donc le retour vaut 4. Pourquoi pas 5 ? parce que le chiffre 2 est séparé d'un espace des 4 premiers chiffres, et il n'y a pas d'espace dans le 2ème argument
echo strspn("7539 2X1234567", "1234567890"); // 4
strspn peut servir à traquer les chaînes de caractères invalides : Par exemple, imaginons qu'il ne faille aucun accent dans un mot : Nous allons alors comparer le mot douteux à une chaîne de caractère représentant l'alphabet :
123456789
echo strspn("carrément",
"abcdefghijklmnopqrstuvwxyz");
Va renvoyer 4, puisque la comparaison est correcte jusqu'au 4ème caractère. On peut alors écrire quelque chose du style :
$LaChaine = "carrément";
if (strspn($LaChaine, "abcdefghijklmnopqrstuvwxyz")
< strlen($LaChaine))
echo "La chaîne de caractère est invalide";
En effet, si strspn renvoie une plus petite valeur que la longueur même de la chaîne, c'est qu'il y a eu une vérification invalide (au moins une).
strcspn est la fonction contraire : elle donne le nombre de caractères pas en commun :
echo strcspn("XX947", "1234567890"); // 2 (XX)
echo strlen ("12 34"); // 5
012345
echo strpos("abcdef",
"c"); // 2
echo strpos("abcdef",
"cd"); // 2
echo strpos("abcdef",
"C"); // rien (case
sensitive)
echo strpos("abcdef",
"abcdef"); // 0
echo strpos("abcdef", "abcdefghi");
// rien
echo strpos("abcdef", "");
// erreur
echo strpos(123, 2);
// rien (Nombres)
111111111122
0123456789012345678901
$EMail = "luc.dupont@truc.uni.fr";
echo strpos($EMail , ".");
// 3
echo strrpos($EMail , ".");
// 19
Note externe :
La fonction strpos() pose depuis longtemps un problème en PHP.Cette fonction, pourtant très utile, recherche une occurrence dans
une chaine et retourne la position de cette première occurence si elle
est trouvée. Dans le cas contraire, elle retourne false.
Problème : le premier élément d'une chaine (donc
d'un tableau, car une chaine est un tableau...) étant indicé 0,
cette fonction semble également retourner false si l'occurrence cherchée
se trouve en tout début de chaine !
Il est donc délicat de distinguer le cas d'une occurrence n'ayant
pas été trouvée, du cas ou l'occurrence se trouve en début
de chaine.
Une solution consiste à tester finement la valeur retournée
par strpos().
Si on affiche cette valeur, on constate qu'une occurrence non trouvée
retourne une chaine vide et qu'une occurrence trouvée en début
de chaine retourne 0. L'idée consiste donc à ne plus tester false,
mais si la valeur retounée est un entier ou non.
Exemple :
<?php
$chaine = "Demain il fera beau";
$occurrence = Array("il", "elle", "Demain");
while (list($element,
$valeur) = each($occurrence)) {
print $valeur." : ";
$pos = strpos($chaine,$valeur);
print $pos." -> ";
if (is_int($pos)==false)
print "J'ai pas trouvé";
else
print "J'ai trouvé";
print "\n";
}
?>
Cet exemple retournera :
il : 7 -> J'ai trouvé
elle : -> J'ai pas trouvé
Demain : 0 -> J'ai trouvé
echo strrev("12345"); // 54321
echo ucwords("Hè
! SALUT tout Le mONDE"); // Hè ! SALUT Tout Le MONDE
echo strtolower("Hè ! SALUT tout Le mONDE");
// hè ! salut tout le monde
echo strtoupper("Hè ! SALUT tout Le mONDE");
// HÈ ! SALUT TOUT LE MONDE
print substr_count("abcABCaBCabc", "abc"); // 2
substr accepte deux ou trois arguments.
echo
substr("0123456789"); // Erreur
echo substr("0123456789" , 2);
// 23456789
echo substr("0123456789" , 2, 1);
// 2
echo substr("0123456789" , 1000);
// rien
echo substr("0123456789" , 2 , 1000); // 23456789
Si le 3ème argument est négatif, ça veut dire qu'il compte à partir de l'extrême droite de la chaîne :
echo substr("0123456789"
, 5 , -1 ); // 5678
echo substr("0123456789" , 0
, -1 ); // 012345678
echo substr("0123456789" , 3 , -3 ); // 3456
Si le 2ème argument est négatif, ça veut dire qu'on commence à extraire à partir d'un certain nombre de caractères depuis l'extrême droite de la chaîne :
echo substr("0123456789" , -3 , -1 ); // 78
trim : enlève les espaces et les caractères invisibles de début et de fin de chaîne (nettoyage)
Liste des caractères retirés par trim :
echo "DEBUT" , trim (" ca marche bien ! ") , "FIN";
affiche :
DEBUTca marche bien !FIN
Cette fonction va insérer le texte qu'on veut (ici : SUIVANT) tous les X (10) caractères, mais en faisant attention de ne pas couper les mots en plein milieu à moins que ce soit impossible de faire autrement
echo wordwrap("C'est incroyable ce que cette fonction peut être pratique !", 10 ,"SUIVANT");
Affiche :
C'estSUIVANTincroyableSUIVANTce queSUIVANTcetteSUIVANTfonctionSUIVANTpeut êtreSUIVANTpratique !
Une application bien utile serait la pose d'une balise <BR> tous les X caractères :
Exemple : (L'espace entre 2 et 3 est voulu)
$Texte = "12 345678901234567890";
echo wordwrap($Texte, 5,
"<BR>",1);
Donne : (en résultat d'affichage HTML) :
12
34567
89012
34567
890
Une césure automatique après le 2, car il constate que le mot suivant ferait dépasser la limite de 5, normal, c'est ce qu'il fait dans tous les cas, mais il coupe le 2ème mot 345678901234567890 en plusieurs morceaux. A contrario, si on omet le 4ème paramètre (ce 1 bizarre) :
$Texte = "12 345678901234567890";
echo wordwrap( $Texte, 5, "<BR>");
Il coupe toujours le premier mot, mais le mot trop long suivant dépasse la limite de 5 caractères :
12
345678901234567890
précisez les tags à préserver.
Exemple :
$chaine="<body><html><hr><b><i>Ceci
est un exemple</i></b></html></body>";
$chaine= strip_tags($chaine,"<hr>,<i>");
echo $chaine;
renvoie Ceci est un exemple en italique avec la balise hr préservée :
<hr><i>Ceci est un exemple</i>
Il est parfois utile de récupérer la fin d'une chaîne a partir d'un certain caractère. Par exemple, admettons que je veux récupérer le nom du fichier dans la chaîne :
C:\docs\dessins\architecture\maison.bmp
Il serait pratique de récupérer tout le texte qui se trouve à droite du DERNIER slash /. Comme ceci :
$MonTexte = "C:\docs\dessins\architecture\maison.bmp"
echo strrchr($MonTexte,"\");
// \maison.bmp
---