Manuel PHP
Précédent | Chapitre 6. Les types | Suivant

# Les chaînes de caractères

Les chaînes de caractères sont des séquences de caractères. En PHP, un caractère est un octet, et il y en 256 de possibles. PHP n'a pas (encore?) de support natif d'Unicode.

> Note : La taille n'est pas un problème majeur pour une chaîne. Elle peut devenir très grande sans problème. Il n'y a a pas à s'en faire pour cela.

## Syntax

Une chaîne peut être spécifiée de trois manières différentes :

- guillemets simples

- guillemets doubles

- syntaxe HereDoc

### guillemets simples

Le moyen le plus simple de spécifier une chaîne de caractères est d'utiliser les guillemets simples : `'`.

Pour spécifier un guillemet simple littéral, vous devez l'échapper avec un anti-slash (`\`), comme dans de nombreux langages. Si un anti-slash doit apparaître dans votre chaîne ou bien en fin de chaîne, il faudra le doubler. Notez que si vous essayez d'échapper n'importe quel autre caractère, l'anti-slash sera conservé! Il n'y a pas besoin d'échapper d'autres caractères que le guillemets lui-même.

> Note : En PHP 3, une alerte sera affichée si cela arrive avec un niveau de rapport d'erreur de `E_NOTICE`.

> Note : Contrairement aux autres syntaxes, les variables présentes dans la chaîne ne seront PAS remplacées par leurs valeurs.

    <?php
      echo 'Ceci est une chaîne simple';
      echo 'Vous pouvez inclure des nouvelles lignes dans une chaîne,
      comme ceci.';
      echo 'Arnold a coutume de dire : "I\'ll be back"';
    // affiche : ... "I'll be back"
      echo 'Etes vous sÛr de vouloir effacer le dossier C:\\*.*?';
    // affiche : Etes vous sÛr de vouloir effacer le dossier C:\*.*?
      echo 'Etes vous sÛr de vouloir effacer le dossier C:\*.*?';
    // affiche : Etes vous sÛr de vouloir effacer le dossier C:\*.*?
      echo 'Je suis en train de mettre une nouvelle ligne comme ceci : \n';
    // affiche : Je suis en train de mettre une nouvelle ligne comme ceci : \n
    ?>

### Guillemets doubles

Si la chaîne est entourés de guillemets doubles, PHP va comprendre certaines séquences de caractères :

Tableau 6-1. Les caractères spéciaux

Séquence | Valeur
--- | ---
`\n` | Nouvelle ligne (linefeed, LF ou 0x0A (10) en ASCII)
`\r` | Retour à la ligne(carriage return, CR ou 0x0D (13) en ASCII)
`\t` | Tabulation horizontale (HT ou 0x09 (9) en ASCII)
`\\` | Antislash
`\$` | Caractère $
`\"` | Guillemets doubles
`\[0-7]{1,3}` | Une séquence de caractères qui permet de rechercher un nombre en notation octale.
`\x[0-9A-Fa-f]{1,2}` | Une séquence de caractères qui permet de rechercher un nombre en notation hexadécimale.

Si vous essayez d'utiliser l'anti-slash sur n'importe quelle autre séquence, l'anti-slash sera affiché dans votre chaîne.

Le plus important des chaînes à guillemets doubles est le fait que les variables qui s'y trouvent seront remplacées par leurs valeurs. Voir la section sur le traitement des variables dans les chaînes pour plus de détails.

### Syntaxe Heredoc

Un autre moyen de délimiter les chaînes est d'utiliser la syntaxe de "Here doc" (en français, documentation ici): <<<, suivi d'un identifiant arbitraire, puis de la chaîne. Cette séquence se termine par l'identifiant initial, placé en premier sur une nouvelle ligne.

L'identifiant utilisé doit suivre les mêmes règles que les étiquettes PHP : il ne doit contenir uniquement que des caractères alpha-numériques, et des soulignés ("_"), et enfin, commencer par un caractère alphabétique ou un souligné.

Avertissement
Il est très important de noter que la ligne qui contient l'identifiant de fermeture ne doit contenir aucun autre caractère, hormis, éventuellement, un point-virgule `;`. Cela signifie notamment que l'identifiant ne doit pas être indenté, et qu'il n'y a aucun caractère blanc entre le retour à la ligne et l'identifiant, ou bien entre l'identifiant et le `;`. Le plus dur est peut être qu'il ne faut pas qu'il y ait un retour à la ligne ((`\r`) à la fin de cette ligne, mais seulement un form-feed (`\n`). Puisque Microsoft Windows utilise la séquence `\r\n` comme terminaison de ligne, la syntaxe heredoc risque de ne pas fonctionner là. Cependant, la plupart des éditeurs PHP fournissent une sauvegarde au format UNIX.

La syntaxe Here doc se comporte exactement comme une chaîne à guillemets doubles, sans les guillemets doubles. Cela signifie que vous n'avez pas à échapper les guillemets (simples ou doubles) dans cette syntaxe. Les variables sont remplacées par leur valeur, et le même soin doit leur être apporté que dans les chaînes à guillemets doubles.

Exemple 6-1. Exemple de chaîne HereDoc
    <?php
      $str = <<<EOD
      Exemple de chaîne
      s'étalant sur
      plusieurs lignes
      avec 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 = 'MonNom';
      echo <<<EOT
      Mon nom est "$name". J'affiche des $foo->foo.
      Maintenant, j'affiche un {$foo->bar[1]}.
      Ceci se traduit par un 'A' majuscule: \x41
    EOT;
    ?>

> Note : Le support Here doc a été ajouté en PHP 4.

### Traitement des variables dans les chaînes

Lorsqu'une chaîne est spécifiée avec des guillemets doubles, ou en utilisant la syntaxe heredoc, les variables qu'elle contient sont remplacées par leur valeur.

Il y a deux types de syntaxe, une simple et une complexe. La syntaxe simple est la plus courante, et la plus pratique : elle fournit un moyen d'utiliser les variables, que ce soit des chaînes, des tableaux ou des membres d'objets.

La syntaxe complexe a été introduite en PHP 4 et peut être reconnue grâce aux accolades entourant les expressions.

#### Syntaxe simple

Dès qu'un signe dollar `$` est rencontré, l'analyseur PHP va lire autant de caractère qu'il peut pour former un nom de variable valide. Entourez le nom de la variable avec des accolades pour indiquer explicitement son nom.

    <?php
      $boisson = 'vin';
      echo "Du $boisson, du pain et du fromage!';
     // OK, car "," n'est pas autorisé dans les noms de variables
      echo "Il a goÛté plusieurs $vins";
     // Pas OK, car 's' peut entrer dans un nom de variable, et PHP recherche $boissons
      echo "Il a goÛté plusieurs ${vin}s";
     // OK
    ?>

Similairement, vous pouvez aussi utiliser un élément de tableau, ou un membre d'objet. Pour les éléments de tableau, le crochet fermant '`]`' marquera la fin du nom de la variable. Pour les membres d'objets, les mêmes règles que ci-dessus s'appliquent. Cependant, il n'existe pas de truc comme pour les variables simples.

    $fruits = array( 'fraise' => 'rouge' , 'banane' => 'jaune' );
     echo "Une banane est $fruits[banane].";
     // OK. Notez toutefois que pour cet exemple, cela fonctionne
     // différemment. Voyez $foo[bar] hors des chaînes
     echo "Ce carré est large de $carre->largeur mètres.";
     // OK
     echo "Ce carré est large de $carre->largeur00 mètres..";
     // pas OK
     // pour résoudre ce problème, voyez syntaxe complexe.

Pour tout ce qui sera plus compliqué, voyez la syntaxe complexe.

#### Syntaxe complexe

La syntaxe est dite "complexe" car elle permet l'utilisation d' expressions complexes, et non pas parcequ'elle serait obscure. Nuance.

En fait, vous pouvez inclure n'importe quelle valeur qui est dans l'espace de nom avec cette syntaxe. Il suffit d'écrire une expression exactement comme si elle était hors de la chaîne, puis de l'entourer d'accolades `{}`. Puisque vous ne pouvez pas échapper les accolades, cette syntaxe ne commence qu'à partir du signe dollar, qui suit immédiatement l'accolade ouvrante. Par exemple, vous pouvez utiliser `"{\$"` pour obtenir un `"{$"` littéral. Voici quelques exemples :

    <?php
      $super = 'fantastique';
      echo "C'est { $super}";
    // ne fonctionne pas,
    // affiche "C'est { fantastique}"
      echo "C'est {$super}";
    // fonctionne,
    // affiche "C'est fantastique"
      echo "Ce carré a {$square->width}00 centimètres de large.";
      echo "Ceci fonctionne : {$tableau[4][3]}";
      echo "Ceci échoue : {$tableau[foo][3]}";
    // pour la même raison que $tableau[bar] ne fonctionne pas hors d'une chaîne

      echo "Essayez plutôt comme ceci : {$tableau['foo'][3]}";
      echo "Vous pouvez même écrire {$objet->valeurs[3]->nom}";
      echo "Voici la valeur de la variable nommée $name: {${$name}}";

    // cela fonctionne, mais c'est vivement déconseillé.
    // Et pour finir, on peut combiner avec des fonctions
      $inv = 'Bordeaux';
      echo "Je reprendrai bien un verre de cet excellent {${ strrev('niv') }}, hips";

    ?>

### Accès aux caractères d'une chaîne

Les caractères d'une chaîne sont accessibles en spécifiant leur offset (le premier caractère est d'offset 0) entre accolade, après le nom de la variable.

> Note : Pour assurer la compatibilité ascendante, vous pouvez toujours accéder aux caractères avec des crochets. Mais cette syntaxe est obsolète en PHP 4.

Exemple 6-2. Exemples de chaînes
    <?php
    /* Affectation d'une chaîne. */
      $str = "Ceci est une chaîne";
    /* Concaténation. */
      $str = $str . " avec un peu plus de texte";
    /* Une autre méthode de concaténation. */
      $str .= " et une nouvelle ligne à la fin.\n";
    /*  Cette chaîne finira comme : '<p>Nombre: 9</p>' */
      $num = 9;
      $str = "<p>Nombre: $num</p>";
    /* Celle-ci sera '<p>Nombre: $num</p>' */
      $num = 9;
      $str = '<p>Nombre: $num</p>';
    /* Premier caractère d'une chaîne */
      $str = 'Ceci est un test.';
      $first = $str{0};
    /* Dernier caractère d'une chaîne. */
      $str = 'This is still a test.';
      $last = $str{strlen($str)-1};
    ?>

## Fonctions et opérateurs pratiques

Les chaînes peuvent être concaténées avec l'opérateur '.' (point). Notez que l'opérateur d'addition '+' (plus) ne fonctionnera pas. Reportez-vous à la section opérateurs de chaînes.

Il y a une grande quantité de fonctions pratiques pour modifier les chaînes.

Reportez-vous à la section chaînes de caractères pour les fonctions les plus générales, à Expressions régulières Perl et Expressions régulières POSIX extendues pour les recherches et remplacements.

Il y a aussi les fonctions sur les URL, ainsi que des fonctions de chiffrage (mcrypt et mhash).

Finalement, si vous ne trouvez toujours pas votre bonheure, il y a les fonctions de types de caractères.

## Conversion de type

Lorsqu'une chaîne de caractère est évaluée comme une valeur numérique, le résultat et le type de la variable sont déterminés comme suit.

La chaîne de caractères est de type "double" si elle contient un des caractère '.', 'e' ou 'E'. Sinon, elle est de type entier ("integer").

La valeur est définie par la première partie de la chaîne. Si la chaîne de caractères débute par une valeur numérique cette valeur sera celle utilisée. Sinon, la valeur sera égale à 0 (zéro).

Lorsque la première expression est une chaîne de caractères, le type de la variable dépend de la seconde expression.

    <?php
      $foo = 1 + "10.5";              // $foo est du type  float (11.5)
      $foo = 1 + "-1.3e3";            // $foo est du type  float (-1299)
      $foo = 1 + "bob-1.3e3";         // $foo est du type  integer (1)
      $foo = 1 + "bob3";              // $foo est du type  integer (1)
      $foo = 1 + "10 Small Pigs";     // $foo est du type  integer (11)
      $foo = 1 + "10 Little Piggies"; // $foo est du type  integer (11)
      $foo = "10.0 pigs " + 1;        // $foo est du type  integer (11)
      $foo = "10.0 pigs " + 1.0;      // $foo est du type  float (11)
    ?>

Pour plus d'informations sur les conversions de type, voir les pages de man à propos de la fonction strtod(3).

Si vous voulez testez l'un des exemples de cette section, vous pouvez faire un copier/coller et l'insérer dans un script pour voir comment il se comporte.

    <?php
      echo "\$foo==$foo; type is " . gettype( $foo ) . "<br>\n";
    ?>

Précédent | Sommaire | Suivant
Les nombres à virgule flottante | Niveau supérieur | Les tableaux