Les cha�nes de caract�res

Une cha�ne de caract�res est une s�rie de caract�res. Avant PHP 6, un caract�re est la m�me chose qu'un octet. Ainsi, il y a exactement 256 caract�res diff�rents. Ceci impliquait �galement que PHP n'avait pas de support natif pour l'Unicode. Voir les fonctions utf8_encode() et utf8_decode() pour des fonctionnalit�s Unicode simples.

Note: Ce n'est pas un probl�me pour une cha�ne de caract�res de devenir tr�s grande. PHP n'impose pas de taille � une cha�ne de caract�res ; la seule limite est la m�moire disponible sur le syst�me sous lequel PHP s'ex�cute.

Syntaxe

Une cha�ne de caract�res litt�rale peut �tre sp�cifi�e de 4 fa�ons diff�rentes :

Entour�e de simple guillemet

La fa�on la plus simple de sp�cifier une cha�ne de caract�res est de l'entourer de guillemet simple (le caract�re ').

Pour sp�cifier un guillemet simple litt�ral, vous devrez l'�chapper d'un antislash (\). Pour sp�cifier un antislash litt�ral avant un guillemet simple, ou � la fin d'une cha�ne de caract�res, �chappez-le deux fois (\\). Notez que si vous tentez d'�chapper n'importe quel autre caract�re, l'antislash s'affichera.

Note: Contrairement aux 2 autres syntaxes, les variables et les s�quences �chapp�es des caract�res sp�ciaux ne seront pas trait�es lorsqu'elles seront dans une cha�ne de caract�res entour�e de simple guillemet.

<?php
echo 'ceci est une cha�ne simple';

echo 
'Vous pouvez �galement ajouter des nouvelles lignes
dans vos cha�nes
de cette fa�on'
;

// Affiche : Arnold dit : "I'll be back"
echo 'Arnold dit : "I\'ll be back"';

// Affiche : Voulez-vous supprimer C:\*.*?
echo 'Voulez-vous supprimer C:\\*.*?';

// Affiche : Voulez-vous supprimer C:\*.*?
echo 'Voulez-vous supprimer C:\*.*?';

// Affiche : Ceci n'affichera pas \n de nouvelle ligne
echo 'Ceci n\'affichera pas \n de nouvelle ligne';

// Affiche : Les variables ne seront pas $traitees $ici
echo 'Les variables ne seront pas $traitees $ici';
?>

Entour�e de guillemet double

Si la cha�ne de caract�res est entour�e de guillemet double ("), PHP interpr�tera plus de s�quences �chapp�es pour les caract�res sp�ciaux :

Caract�res �chapp�s
S�quence Signification
\n Fin de ligne (LF ou 0x0A (10) en ASCII)
\r Retour � la ligne (CR ou 0x0D (13) en ASCII)
\t Tabulation horizontale (HT or 0x09 (9) en ASCII)
\v Tabulation verticale (VT or 0x0B (11) en ASCII) (depuis PHP 5.2.5)
\f Saut de page (FF ou 0x0C (12) en ASCII) (depuis PHP 5.2.5)
\\ Antislash
\$ Signe dollars
\" Guillemet double
\[0-7]{1,3} La s�quence de caract�res correspondant � une expression r�guli�re est un caract�re, en notation octal
\x[0-9A-Fa-f]{1,2} La s�quence de caract�res correspondant � une expression r�guli�re est un caract�re, en notation hexad�cimale

De la m�me fa�on que pour les cha�nes entour�es de simple guillemet, l'�chappement de tout autre caract�re affichera l'antislash. Avant PHP 5.1.1, l'antislash de \{$var} n'�tait pas affich�.

La fonctionnalit� la plus int�ressante des cha�nes entour�es de guillemet double est que les noms de variables sont trait�s. Voir la documentation sur l'analyse des cha�nes de caract�res pour plus de d�tails.

Syntaxe Heredoc

Une 3�me fa�on de d�limiter une cha�ne de caract�res est la syntaxe Heredoc : <<<. Apr�s cet op�rateur, un identifiant est fourni, puis, une nouvelle ligne. La cha�ne elle-m�me suit, puis, le m�me identifiant pour fermer la notation.

L'identifiant doit commencer la premi�re colonne de la ligne. De plus, l'identifiant doit suivre les m�mes r�gles que n'importe quel libell� PHP : il ne doit contenir que des caract�res alphanum�riques et des soulign�s, et doit commencer par un caract�re non num�rique ou un soulign� ("underscore").

Avertissement

Il est tr�s important de noter que la ligne contenant l'identifiant ne doit contenir aucun autre caract�re, mise � part, �ventuellement, un point-virgule (;). Cela signifie que l'identifiant ne doit pas �tre indent�, et il ne doit y avoir aucun espace ou tabulation avant ou apr�s le point-virgule. Il est �galement important de garder � l'esprit que le premier caract�re avant l'identifiant de fermeture doit �tre une nouvelle ligne sur les syst�mes Unix, incluant Mac OSX (caract�re \n). Le d�limiteur de fermeture (pouvant �tre suivi d'un point-virgule) doit aussi �tre suivi d'une nouvelle ligne.

Si cette r�gle n'est pas respect�e et que l'identifiant de fermeture n'est pas "propre", il ne sera pas consid�r� comme identifiant de fermeture, et PHP continuera � en chercher un. Si un identifiant de fermeture "propre" n'est pas trouv� avant la fin du fichier courant, une erreur d'analyse sera �mise � la derni�re ligne.

Heredoc ne peut �tre utilis� pour initialiser les membres d'une classe. Depuis PHP 5.3, cette limitation ne s'applique qu'aux Heredoc qui contiennent des variables.

Exemple #1 Exemple invalide

<?php
class foo {
    public 
$bar = <<<EOT
bar
EOT;
}
?>

Heredoc se comporte exactement comme une cha�ne entour�e de double guillemet, sans avoir de double guillemet. Cela signifie que les guillemets dans une syntaxe Heredoc n'ont pas besoin d'�tre �chapp�s, mais les codes d'�chappement list�s ci-dessus peuvent toujours �tre utilis�s. Les variables seront trait�es mais les m�mes attentions doivent �tre prises lorsque vous utilisez des variables complexes dans une syntaxe Heredoc.

Exemple #2 Exemple de cha�nes Heredoc

<?php
$str 
= <<<EOD
Exemple de cha�ne
sur plusieurs lignes
en utilisant la syntaxe Heredoc.
EOD;

/* Exemple plus complexe, avec des variables. */
class foo
{
    var 
$foo;
    var 
$bar;

    function 
foo()
    {
        
$this->foo 'Foo';
        
$this->bar = array('Bar1''Bar2''Bar3');
    }
}

$foo = new foo();
$name 'MyName';

echo <<<EOT
Mon nom est "$name". J'affiche quelques $foo->foo.
Maintenant, j'affiche quelques 
{$foo->bar[1]}.
Et ceci devrait afficher un 'A': \x41
EOT;
?>

L'exemple ci-dessus va afficher :

Mon nom est "MyName". J'affiche quelques Foo.
Maintenant, j'affiche quelques Bar2.
Et ceci devrait afficher un 'A' majuscule : A

Il est aussi possible d'utiliser la syntaxe Heredoc pour passer des arguments � une fonction :

Exemple #3 Exemple d'utilisation de Heredoc pour passer des arguments

<?php
var_dump
(array(<<<EOD
foobar!
EOD
));

Depuis PHP 5.3.0, il est possible d'initialiser les variables statiques et les propri�t�s ou constantes de classes avec la syntaxe Heredoc :

Exemple #4 Utilisation de Heredoc pour initialiser des valerus statiques

<?php
// Variables statiques
function foo()
{
    static 
$bar = <<<LABEL
Nothing in here...
LABEL;
}

// Constantes et propri�t�s de classe
class foo
{
    const 
BAR = <<<FOOBAR
Constant example
FOOBAR;

    public 
$baz = <<<FOOBAR
Property example
FOOBAR;
}
?>

PHP 5.3.0 introduit aussi la possibilit� pour Heredoc d'utiliser les guillemets doubles dans les d�clarations :

Exemple #5 Utilisation des guillemets doubles avec Heredoc

<?php
echo <<<"FOOBAR"
Hello World!
FOOBAR;
>

Note: Le support de la syntaxe Heredoc a �t� ajout� en PHP 4.

Nowdoc

Nowdoc est aux cha�nes entour�es de guillemet simple ce qu'Heredoc est aux cha�nes entour�es de guillemet double. Nowdoc est sp�cifi� de mani�re similaire � Heredoc, mut aucune analyse n'est effectu�e dans une syntaxe Nowdoc. La construction est id�ale pour embarquer du code PHP ou d'autres larges blocs de texte, sans avoir besoin d'�chapper quoi que ce soit. Cette syntaxe partage les m�mes fonctionnalit�s que le constructeur SGML <![CDATA[ ]]>, en ce qu'elle d�clare un bloc de texte qui ne doit pas �tre analys�.

Nowdoc est identifi� avec la m�me s�quence <<< utilis�e par Heredoc, mais l'identifiant qui suit est entour� de guillemet simple,e.g. <<<'EOT'. Toutes les r�gles concernant les identifiants Heredoc sont �galement appliquer aux identifiants Nowdoc, et tout sp�cialement, celles concernant l'apparence de l'identifiant.

Exemple #6 Exemple de cha�nes Nowdoc

<?php
$str 
= <<<'EOD'
Exemple de cha�ne
sur plusieurs lignes
en utilisant la syntaxe Nowdoc.
EOD;

/* Exemple complexe, avec des variables. */
class foo
{
    public 
$foo;
    public 
$bar;

    function 
foo()
    {
        
$this->foo 'Foo';
        
$this->bar = array('Bar1''Bar2''Bar3');
    }
}

$foo = new foo();
$name 'MyName';

echo <<<'EOT'
Mom nom est "$name". J'affiche quelques $foo->foo.
Maintenant, j'affiche quelques {$foo->bar[1]}.
Ceci ne devrait pas afficher un 'A': \x41
EOT;
?>

L'exemple ci-dessus va afficher :

Mom nom est "$name". J'affiche quelques $foo->foo.
Maintenant, j'affiche quelques {$foo->bar[1]}.
Ceci ne devrait pas afficher un 'A': \x41

Note: Contrairement � Heredoc, NowDoc peut �tre utilis� dans n'importe quel contexte de donn�es statiques. L'exemple typique est l'initialisation de membres ou de constantes de classe :

Exemple #7 Exemple avec des donn�es statiques

<?php
class foo {
    public 
$bar = <<<'EOT'
bar
EOT;
}
?>

Note: Le support Nowdoc a �t� ajout� en PHP 5.3.0.

Analyse des variables

Lorsqu'une cha�ne de caract�res est sp�cifi� en guillemet double ou en Heredoc, les variables sont analys�es.

Il y a 2 types de syntaxe : une simple et une complexe. La syntaxe simple est la plus commune et la plus pratique. Elle fournit une fa�on d'embarquer une variable, un tableau ou un objet dans une cha�ne avec un minimum d'effort.

La syntaxe complexe a �t� introduite en PHP 4, et se reconna�t en l'utilisation d'accolades autour de l'expression.

Syntaxe simple

Si un signe dollars ($) est rencontr�, l'analyse prendra autant de caract�res que possible pour former un nom de variable valide. Si vous entourez un nom de variable par des accolades explicitement, alors le nom de la variable n'aura aucune ambigu�t�.

<?php
$beer 
'Heineken';
echo 
"$beer's taste is great"// fonctionne ; "'" est un caract�re invalide pour les noms de variable
echo "He drank some $beers";   // ne fonctionne pas ; 's' est un caract�re valide dans un nom de variable et la variable est en fait "$beer"
echo "He drank some ${beer}s"// fonctionne
echo "He drank some {$beer}s"// fonctionne
?>

De la m�me fa�on, l'index d'un tableau ou la propri�t� d'un objet peut �tre analys�. Avec les indices d'un tableau, les crochets (]) forment la fin de l'index. Les m�mes r�gles sont appliqu�es aux propri�t�s d'objet comme pour les simples variables.

<?php
// Ces exemples sont sp�cifiques � l'utilisation des tableaux dans des cha�nes.
// Lorsqu'ils sont � l'ext�rieur d'une cha�ne, quottez toujours les cha�nes repr�sentant
// les cl�s du tableau et n'utilisez pas d'{accolades}.

// Montre toutes les erreurs
error_reporting(E_ALL);

$fruits = array('strawberry' => 'red''banana' => 'yellow');

// Fonctionne, mais notez que cela fonctionne diff�remment � l'ext�rieur d'une cha�ne
echo "A banana is $fruits[banana].";

// Fonctionne
echo "A banana is {$fruits['banana']}.";

// Fonctionne, mais PHP cherche une constante nomm�e banana en premier, tel que d�crit ci-dessous
echo "A banana is {$fruits[banana]}.";

// Ne fonctionne pas, utilisez des accolades. Ceci produira une erreur d'analyse.
echo "A banana is $fruits['banana'].";

// Fonctionne
echo "A banana is " $fruits['banana'] . ".";

// Fonctionne
echo "This square is $square->width meters broad.";

// Ne fonctionne pas. Pour une solution, reportez-vous � la syntaxe complexe.
echo "This square is $square->width00 centimeters broad.";
?>

Pour tout ce qui est encore plus complexe, vous devriez utiliser la syntaxe complexe.

Syntaxe complexe

Cette syntaxe est appel�e complexe, non pas par qu'elle est complexe, mais parce qu'elle permet l'utilisation d'expressions complexes.

En fait, n'importe quelle valeur d'un espace de nom peut �tre inclue dans une cha�ne de caract�res avec cette syntaxe. �crivez simple l'expression de la m�me fa�on qu'elle devrait l'�tre � l'ext�rieur de la cha�ne et ensuite, entourez-l� des caract�res { et }. Sachant que le caract�re { ne peut pas �tre �chapp�, cette syntaxe ne sera reconnue que lorsque le caract�re $ suit imm�diatement le caract�re {. Utilisez {\$ pour afficher litt�ralement {$. Quelques exemples pour �tre clair :

<?php
// Montre toutes les erreurs
error_reporting(E_ALL);

$great 'fantastic';

// Ne fonctionne pas, affiche : This is { fantastic}
echo "This is { $great}";

// Fonctionne, affiche : This is fantastic
echo "This is {$great}";
echo 
"This is ${great}";

// Fonctionne
echo "This square is {$square->width}00 centimeters broad."

// Fonctionne
echo "This works: {$arr[4][3]}";

// Ceci est faux pour la m�me raison pour laquelle $foo[bar] est faux � l'ext�rieur d'une cha�ne.
// En d'autres termes, ceci fonctionnera, mais uniquement parceque PHP cherchera d'abord
// une constante nomm�e foo ; une erreur de niveau E_NOTICE (constante ind�finie) sera �mise.
echo "This is wrong: {$arr[foo][3]}"

// Fonctionne. Lors de l'utilisation de tableaux multidimensionnels, utilisez toujours
// les accolades autour du tableaux lorsqu'il se trouve dans la cha�ne
echo "This works: {$arr['foo'][3]}";

// Fonctionne.
echo "This works: " $arr['foo'][3];

echo 
"This works too: {$obj->values[3]->name}";

echo 
"This is the value of the var named $name{${$name}}";

echo 
"This is the value of the var named by the return value of getName(): {${getName()}}";

echo 
"This is the value of the var named by the return value of \$object->getName(): {${$object->getName()}}";
?>

Note: Les appels de fonctions et de m�thodes dans {$} fonctionnent depuis PHP 5.

Acc�s et modification d'une cha�ne, par caract�re

On peut acc�der et modifier les caract�res d'une cha�ne de caract�res en sp�cifiant sa position (� partir de 0) en utilisant la m�me syntaxe que pour les tableaux, comme pour la variable $str[42]. Il convient de voir une cha�ne de caract�res comme un tableau dans ce cas.

Note: On peut �galement acc�der � une cha�ne en utilisant des accolades, comme ceci : $str{42}. Cependant, cette syntaxe est obsol�te depuis PHP 6. Utilisez les crochets � la place.

Avertissement

�crire � une position hors de l'intervalle de l'existant fait que la cha�ne est compl�t�e par des espaces jusqu'� cette position. Les positions sont toujours converties en valeur enti�re. Les positions invalides produisent une alerte E_NOTICE. Les positions n�gatives produisent une alerte E_NOTICE en �criture, mais lisent une cha�ne vide. Seul le premier caract�re d'une cha�ne assign�e est utilis�e. Assigner une cha�ne vide assigne le caract�re NUL.

Exemple #8 Quelques exemples de cha�nes

<?php
// R�cup�ration du premier caract�re d'une cha�ne
$str 'This is a test.';
$first $str[0];

// R�cup�ration du troisi�me caract�re d'une cha�ne
$third $str[2];

// R�cup�ration du dernier caract�re d'une cha�ne
$str 'This is still a test.';
$last $str[strlen($str)-1]; 

// Modification du dernier caract�re d'une cha�ne
$str 'Look at the sea';
$str[strlen($str)-1] = 'e';

?>

Note: L'acc�s aux autres types de variables en utilisant [] ou {} retournera silencieusement NULL.

Fonctions et op�rateurs utiles

Une cha�ne de caract�res peut �tre concat�n�e en utilisant l'op�rateur '.' (point). Notez que l'op�rateur '+' (addition) ne fonctionnera pas. Reportez-vous aux op�rateurs de cha�ne pour plus d'informations.

Il y a beaucoup de fonctions utiles pour la manipulation de cha�ne de caract�res.

Reportez-vous � la section sur les fonctions des cha�nes de caract�res pour plus de pr�cisions et � la section sur les expressions rationnelles ou sur les expressions rationnelles compatibles Perl pour des recherches et des remplacements avanc�s.

Il y a �galement des fonctions pour les URL, et des fonctions pour chiffrer, d�chiffrer les cha�nes de caract�res (mcrypt et mhash).

Et pour finir, reportez-vous aux fonctions "type de caract�res".

Conversion en cha�ne de caract�res

Une valeur peut �tre convertie en une cha�ne de caract�res, en utilisant le mot cl� (string) ou la fonction strval(). La conversion d'une cha�ne de caract�res est automatiquement effectu�e dans le contexte d'une expression o� une cha�ne de caract�res est n�cessaire. Ceci survient lors de l'utilisation des fonctions echo() ou print() ou lorsqu'une variable est compar�e � une cha�ne. Les sections sur les types et sur le transtypage expliquent ce qui suit de mani�re plus d�taill�es. Reportez-vous �galement � la fonction settype().

La valeur bool�enne TRUE est convertie en la cha�ne "1". La valeur bool�enne FALSE est convertie en "" (une cha�ne vide). Ceci permet les conversions vers et depuis une cha�ne et un bool�en.

Un entier ou un nombre d�cimal est converti en une cha�ne de caract�res repr�sentant le nombre de fa�on textuel (incluant la partie exponentielle pour les nombres � virgule flottante). Les nombres � virgule flottante peuvent �tre convertis en utilisant la notation exponentielle (4.1E+6).

Note: Le point d�cimal est d�finit dans la locale du script (cat�gorie LC_NUMERIC). Reportez-vous � la fonction setlocale().

Les tableaux sont toujours convertis en la cha�ne "Array" ; ainsi, echo() et print() ne peuvent �tre utilis�s pour afficher le contenu d'un tableau. Pour afficher un seul �l�ment, utilisez un constructeur comme echo $arr['foo']. Voir ci-dessous pour des astuces permettant d'afficher le contenu complet.

Les objets en PHP 4 sont toujours convertis en la cha�ne "Object". Pour afficher les valeurs des membres de l'objet (aux fins de d�boguage, par exemple), lisez le paragraphes ci-dessous. Pour r�cup�rer le nom de la classe de l'objet, utilisez la fonction get_class(). Depuis PHP 5, la m�thode __toString est utilis�e lorsqu'elle peut s'appliquer.

Les ressources sont toujours converties en la cha�ne "Resource id #1", o� 1 est le nombre unique assign� � la ressource par PHP au moment de l'ex�cution. Ne vous fiez pas � cette structure, il est possible qu'elle change. Pour r�cup�rer le type de la ressource, utilisez la fonction get_resource_type().

NULL est toujours converti en une cha�ne vide.

Au vue de tout cela, la conversion d'un tableau, d'un objet ou d'une ressource en une cha�ne de caract�res ne fournit aucune information utile sur la valeur contenue dans ce type. Reportez-vous aux fonctions print_r() et var_dump() pour plus d'informations sur le contenu de ces types.

La plupart des valeurs en PHP peuvent �galement �tre convertie en cha�ne de caract�res afin de les stocker. Cette m�thode est appel�e "lin�arisation", et est effectu�e par la fonction serialize(). Si le moteur PHP a �t� compil� avec le support WDDX, les valeurs PHP peuvent �galement �tre lin�aris�es en XML.

Conversion de cha�nes en nombres

Lorsqu'une cha�ne de caract�res est �valu�e dans un contexte num�rique, la valeur et le type r�sultants sont d�termin�s comme suit.

Si la cha�ne de caract�res ne contient aucun '.', 'e', ou 'E' et que la valeur num�rique est dans l'intervalle de repr�sentation des entiers (et notamment plus petite que PHP_INT_MAX), alors la cha�ne de caract�res sera transform�e en entier. Dans les autres cas, elle sera interpr�t�e comme un nombre d�cimal.

La valeur est fournie par la portion initiale de la cha�ne de caract�res. Si la cha�ne de caract�res commence par un caract�re num�rique valide, ce sera la valeur utilis�e. Sinon, la valeur sera de 0 (z�ro). Une valeur num�rique valide est un signe optionnel, suivi par un ou plusieurs nombres (contenant, optionnellement, un point d�cimal), suivi par, �ventuellement, un exponentiel. L'exponentiel est un 'e' ou 'E' suivi par un ou plusieurs nombres.

<?php
$foo 
"10.5";                // $foo est un nombre � virgule flottante (11.5)
$foo "-1.3e3";              // $foo est un nombre � virgule flottante (-1299)
$foo "bob-1.3e3";           // $foo est un entier (1)
$foo "bob3";                // $foo est un entier (1)
$foo "10 Small Pigs";       // $foo est un entier (11)
$foo "10.2 Little Piggies"// $foo est un nombre � virgule flottante (14.2)
$foo "10.0 pigs " 1;          // $foo est un nombre � virgule flottante (11)
$foo "10.0 pigs " 1.0;        // $foo est un nombre � virgule flottante (11)
?>

Pour plus d'informations sur ces conversions, reportez-vous au manuel Unix de la fonction strtod(3).

Pour tester un exemple de cette section, copiez/collez l'exemple et ins�rez la ligne suivante pour voir ce qu'il se passe :

<?php
echo "Le type de \$foo==$foo; est " gettype ($foo) . "<br />\n";
?>

Ne vous attendez pas � r�cup�rer le code d'un caract�re en le convertissant en entier, comme cela est possible en C. Utilisez la fonction ord() et la fonction chr() pour convertir les caract�res en codes ASCII.