PHP - MySQL [Retour au menu]
Les chaînes de caractères

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

Remarque générale

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 !

Les chaines ressemblent aux tableaux

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)

Sommaire des fonctions les plus utilisées

  1. Comparaison de chaînes de caractères : ==, strcmp, strncasecmp
  2. eregi : Récupération de texte dans une chaîne
  3. chr / ord : Renvoi d'un caractère selon son code ASCII, et vice-versa
  4. explode / implode : Transformation d'une chaîne en éléments de tableau et vice-versa
  5. quotemeta : ajout de backslash devant les caractères spéciaux
  6. str_pad : Complète une chaîne de caractères avec un ou plusieurs caractères prédéfinis
  7. str_replace / strtr : remplacer une occurrence de texte par une autre, une lettre par une autre (remplacer les caractères accentués par exemple)
  8. strstr / stristr : récupération de la fin d'une chaîne à partir d'une certaine occurrence
  9. strspn / strcspn : comparaison des caractères communs de 2 chaînes
  10. strlen : renvoie la taille d'une chaîne
  11. strpos / strrpos : Renvoie la position d'une occurrence de texte dans une autre
  12. strrev : inverse une chaîne
  13. ucfirst / ucwords / strtolower / strtuupper : Mise en majuscule de la première lettre d'une chaîne, de chacun des mots de la chaîne, tout en majuscule ou tout en minuscule
  14. substr_count : Compte le nombre d'occurrence d'une chaîne dans une autre
  15. substr : extraction d'une sous-chaîne de caractères dans une chaîne
  16. trim : enlève les espaces et les caractères invisibles de début et de fin de chaîne (nettoyage)
  17. wordwrap : affichage de texte en colonne de largeur fixe
  18. strip_tags : Supprimer des tags HTML
  19. strrchr : Récupère la partie droite d'une chaîne

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


Comparaison de chaînes de caractères

D'une façon globale, les comparaisons entre chaînes sont case-sensitive.

== , strcmp

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";

strncasecmp : Comparaison des X premiers caractères de 2 chaînes

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)


Récupération d'un texte dans un autre texte : eregi et utilisation de (.*)

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

inversion impossible

eregi ("aaa(.*)ccc" , "cccbbbaaa" , $Resultat);

plusieurs occurrences de la même chaîne de texte

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.

Intervalles

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

Recherche depuis le début ou jusqu'à la fin d'une chaîne

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


chr/ord : Renvoi d'un caractère selon son code ASCII

echo chr(65)

Affiche A

echo ord("A")

Affiche 65


explode - implode : Transformation d'une chaîne en éléments de tableau et vice versa

explode

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

implode (Alias : join)

$MonTableau = array('A', 'B', '442');
$Chaine = implode(";", $MonTableau);
echo $Chaine; // A;B;442


quotemeta : ajout de backslash devant les caractères spéciaux

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


str_pad : Complète une chaîne de caractères avec un ou plusieurs caractères prédéfinis

                                                               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


str_replace : remplacer une occurrence de texte par une autre

$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


strstr / stristr : récupération de la fin d'une chaîne à partir d'une certaine occurrence

$UneChaine = "abcABCabcABCabc";
$LeDernierBout = strstr($UneChaine, "BC");
print $LeDernierBout; // BCabcABCabc


strspn / strcspn : comparaison des caractères communs de 2 chaînes

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

Cas pratique

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

strcspn est la fonction contraire : elle donne le nombre de caractères pas en commun :

echo strcspn("XX947", "1234567890"); // 2 (XX)


strlen : renvoie la taille d'une chaîne

echo strlen ("12 34"); // 5


strpos : Renvoie la position d'une occurrence de texte dans une autre

             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é


strrev : inverse une chaîne

echo strrev("12345"); // 54321


ucwords / strtolower / strtuupper : Mise en majuscule de chacun des mots de la chaîne, tout en majuscule ou tout en minuscule

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


substr_count : Compte le nombre d'occurrence d'une chaîne dans une autre

print substr_count("abcABCaBCabc", "abc"); // 2


substr : extraction d'une sous-chaîne de caractères dans une chaîne

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


wordwrap : affichage de texte en colonne de largeur fixe

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


strip_tags : Comment supprimer les tags HTML et PHP présents dans un chaine à l'exception de certains

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>


strrchr : récupérer la partie droite d'une chaîne

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

---