W3docs

quotemeta()

Notre article présente la fonction PHP quotemeta(), utilisée pour échapper les métacaractères dans une chaîne de caractères, utile avec les expressions

La fonction PHP quotemeta() ajoute un antislash avant chaque caractère ayant une signification spéciale dans une expression régulière, et retourne une nouvelle chaîne « échappée ». Utilisez-la lorsque vous souhaitez prendre un texte arbitraire et le faire correspondre littéralement dans un motif, afin que des caractères comme ., * ou ( soient traités comme du texte ordinaire plutôt que comme des opérateurs de regex.

Cette page couvre la syntaxe, les caractères précisément échappés, un exemple concret, le piège courant lié aux délimiteurs, et quand utiliser plutôt preg_quote(), qui est mieux adapté.

Syntaxe

quotemeta(string $str): string

Elle prend un seul argument :

  • $str — la chaîne d'entrée à échapper.

Elle retourne une nouvelle chaîne avec les caractères spéciaux échappés. La chaîne originale n'est pas modifiée. Si $str est une chaîne vide, une chaîne vide est retournée.

Quels caractères sont échappés

quotemeta() place un antislash devant chacun de ces caractères :

.  \  +  *  ?  [  ^  ]  $  (  )

C'est la liste complète. Tout ce qui ne figure pas dans cet ensemble — notamment !, ,, =, -, {, } et | — est laissé intact. C'est une source fréquente de confusion : quotemeta() n'échappe pas tous les caractères de « ponctuation », seulement les onze listés ci-dessus.

Exemple de base

php— editable, runs on the server

Cela produit :

Hello\^World!

Le ^ est échappé car c'est un métacaractère de regex, tandis que le ! est laissé intact — il ne fait pas partie de l'ensemble échappé.

Un exemple plus complet

Pour observer le comportement complet, échappez une chaîne contenant plusieurs métacaractères :

<?php
$pattern = 'price: $9.99 (per item)*';
echo quotemeta($pattern);
?>

Sortie :

price: \$9\.99 \(per item\)\*

Remarquez que l'espace, le deux-points et les chiffres restent inchangés, tandis que $, ., (, ) et * reçoivent chacun un antislash.

Pourquoi l'utiliser

L'intérêt de l'échappement est de faire correspondre un texte fourni par l'utilisateur littéralement. Sans échappement, un terme de recherche comme a.b correspondrait à axb, a-b et tout autre a + caractère + b, car . signifie « n'importe quel caractère » dans une regex :

<?php
$term = 'a.b';
$haystack = 'axb';

// Unescaped: '.' acts as a wildcard and matches 'x'
var_dump((bool) preg_match("/$term/", $haystack));

// Escaped: '.' is treated literally, so it does not match
$escaped = quotemeta($term);
var_dump((bool) preg_match("/$escaped/", $haystack));
?>

Sortie :

bool(true)
bool(false)

quotemeta() vs preg_quote()

quotemeta() est antérieure au moteur PCRE de PHP et n'échappe pas tous les caractères que PCRE considère comme spéciaux — par exemple, elle ignore {, }, | et /. Elle ne peut pas non plus échapper le délimiteur de votre motif.

Pour les motifs PCRE (preg_match(), preg_replace() et leurs homologues), vous devriez presque toujours préférer preg_quote(), qui échappe l'ensemble complet des métacaractères PCRE et accepte un argument optionnel de délimiteur afin que le délimiteur lui-même soit également échappé :

<?php
$term = 'a/b';
echo preg_quote($term, '/'); // a\/b
?>

Utilisez quotemeta() uniquement pour les cas de style POSIX limités pour lesquels elle a été conçue ; pour tout ce qui est lié aux expressions régulières en PHP moderne, utilisez preg_quote().

Fonctions associées

  • preg_quote() — échappe une chaîne pour l'utiliser dans un motif PCRE (le choix recommandé).
  • preg_match() — effectue une correspondance d'expression régulière.
  • preg_replace() — recherche et remplacement à l'aide d'une expression régulière.
  • addslashes() — échappe les guillemets et les antislashs pour les littéraux de chaîne, pas pour les regex.

Pratique

Pratique
Lesquels des caractères suivants sont échappés par la fonction quotemeta() en PHP ?
Lesquels des caractères suivants sont échappés par la fonction quotemeta() en PHP ?
Was this page helpful?