Les options de PCRE sont listées ci-dessous. Les noms entre parenthèses sont les noms internes à PCRE. Les espaces et les caractères de nouvelles lignes sont ignorés dans les modificateurs, les autres caractères causent des erreurs.
- i (PCRE_CASELESS)
- Effectue une recherche insensible à la casse.
- m (PCRE_MULTILINE)
- Par défaut, PCRE traite la chaîne sujet comme une seule ligne (même si cette chaîne contient des retours chariot). Le métacaractère "début de ligne" (^) ne sera valable qu'une seule fois, au début de la ligne, et le métacaractère "fin de ligne " ($) ne sera valable qu'à la fin de la chaîne, ou avant le retour chariot final (à moins que l'option D ne soit activée). C'est le même fonctionnement qu'en Perl. Lorsque cette option est activée, " début de ligne " et " fin de ligne " correspondront alors aux caractères suivant et précédent immédiatement un caractère de nouvelle ligne, en plus du début et de la fin de la chaîne. C'est le même fonctionnement que l'option Perl /m. S'il n'y a pas de caractère de nouvelle ligne "\n" dans la chaîne sujet, ou s'il n'y a aucune occurrence de ^ ou $ dans le masque, cette option ne sert à rien.
- s (PCRE_DOTALL)
- Avec cette option, le métacaractère point (.) remplace n'importe quel caractère, y compris les nouvelles lignes. Sans cette option, le caractère point ne remplace pas les nouvelles lignes. Cette option est équivalente à l'option Perl /s. Une classe de caractères négative telle que [^a] acceptera toujours les caractères de nouvelles lignes, indépendamment de cette option.
- x (PCRE_EXTENDED)
- Avec cette option, les caractères d'espacement sont ignorés, sauf lorsqu'ils sont échappés, ou à l'intérieur d'une classe de caractères, et tous les caractères entre # non échappés et en dehors d'une classe de caractères, et le prochain caractère de nouvelle ligne sont ignorés. C'est l'équivalent Perl de l'option /x : elle permet l'ajout de commentaires dans les masques compliqués. Notez bien, cependant, que cela ne s'applique qu'aux caractères de données. Les caractères d'espacement ne doivent jamais apparaître dans les séquences spéciales d'un masque, par exemple dans la séquence (?( qui introduit une parenthèse conditionnelle.
- e (PREG_REPLACE_EVAL)
AvertissementAvec cette option obsolète, preg_replace() effectue la substitution normale des références arrières dans la chaîne de remplacement, puis l'évalue comme un code PHP, et utilise le résultat pour remplacer la chaîne de recherche. Les guillemets simples, les guillemets doubles, les antislashs et les caractères NULL sont protégés avec des antislashs (\) dans les références arrières substituées.Cette fonctionnalité était obsolète en PHP 5.5.0, et a été supprimée depuis PHP 7.0.0.
AttentionLa fonction addslashes() est exécutée sur toutes les références arrières trouvées avant d'effectuer la substitution. Ainsi, lorsque les références arrières sont utilisées comme des chaînes entre guillemets, les caractères échappés seront convertis en version litérale. Cependant, les caractères qui sont échappés, qui ne sont normalement pas convertis, conserveront leurs slashes. Ceci rend l'utilisation de ce modificateur compliquée.
AttentionAssurez-vous que
replacement
constitue une chaîne de code PHP valide, sinon, PHP émettra une erreur d'analyse à la ligne contenant la fonction preg_replace().AttentionL'utilisation de ce modificateur n'est pas recommandé, sachant qu'il peut introduire très facilement des vulnérabilités :
<?php
$html = $_POST['html'];
// Mise en majuscule
$html = preg_replace(
'(<h([1-6])>(.*?)</h\1>)e',
'"<h$1>" . strtoupper("$2") . "</h$1>"',
$html
);L'exemple ci-dessus peut être facilement exploité en y passant une chaîne comme celle-ci : <h1>{${eval($_GET[php_code])}}</h1>. Ceci fournit à l'attaquant la possibilité d'exécuter du code PHP arbitraire, et ainsi, lui donne un accès quasi global à votre serveur.
Pour éviter de type de vulnérabilité, la fonction preg_replace_callback() doit être utilisée à la place :
<?php
$html = $_POST['html'];
// Mise en majuscule
$html = preg_replace_callback(
'(<h([1-6])>(.*?)</h\1>)',
function ($m) {
return "<h$m[1]>" . strtoupper($m[2]) . "</h$m[1]>";
},
$html
);Note:
Seule preg_replace() utilise cette option. Elle est ignorée par les autres fonctions PCRE.
- A (PCRE_ANCHORED)
- Avec cette option, le masque est ancré de force, c'est-à-dire que le masque doit s'appliquer juste au début de la chaîne sujet pour être considéré comme trouvé. Il est possible de réaliser le même effet en ajoutant les métacaractères adéquats, ce qui est la seule manière de le faire en Perl.
- D (PCRE_DOLLAR_ENDONLY)
- Avec cette option, le métacaractère $ ne sera valable qu'à la fin de la chaîne sujet. Sans cette option, $ est aussi valable avant une nouvelle ligne, si cette dernière est le dernier caractère de la chaîne. Cette option est ignorée si l'option m est activée. Il n'y a pas d'équivalent en Perl.
- S
- Lorsqu'un masque est utilisé plusieurs fois, cela vaut la peine de passer quelques instants de plus pour l'analyser et optimiser le code pour accélérer les traitements ultérieurs. Cette option force cette analyse plus poussée. Actuellement, cette analyse n'est utile que pour les masques non ancrés, qui ne commencent pas par un caractère fixe.
- U (PCRE_UNGREEDY)
- Cette option inverse la tendance à la gourmandise des expressions rationnelles. Vous pouvez aussi inverser cette tendance au coup par coup avec un ? mais cela rendra gourmand la séquence. Cette option n'est pas compatible avec Perl. Elle peut aussi être mise dans le masque avec l'option ?U dans le pattern ou par un point d'interrogation avant le quantificateur (.e.g. .*?).
Note:
Il n'est généralement pas possible de faire correspondre plus que la limite de pcre.backtrack_limit caractères en mode non gourmand.
- X (PCRE_EXTRA)
- Cette option ajoute d'autres fonctionnalités incompatibles avec le PCRE de Perl. Tous les antislashs suivis d'une lettre qui n'aurait pas de signification particulière causent une erreur, permettant la réservation de ces combinaisons pour des ajouts fonctionnels ultérieurs. Par défaut, comme en Perl, les antislashs suivis d'une lettre sans signification particulière sont traités comme des valeurs littérales. Actuellement, cette option ne déclenche pas d'autres fonctions.
- J (PCRE_INFO_JCHANGED)
- L'option (?J) interne de configuration modifie l'option locale PCRE_DUPNAMES. Permet la duplication de noms pour les sous-masques.
- u (PCRE_UTF8)
- Cette option désactive les fonctionnalités additionnelles de PCRE qui ne sont pas compatibles avec Perl. Le masque et la chaîne d'entrée sont traitées comme des chaînes UTF-8. Cette option est disponible en PHP 4.1.0 et plus récent sur plate-forme Unix et depuis PHP 4.2.3 sur plate-forme Windows. La validité UTF-8 de la chaîne d'entrée et du masque est vérifiée depuis PHP 4.3.5. Une chaîne d'entrée invalide entrainera aucune détection par les fonctions preg_*. Un masque invalide va lever une erreur de niveau E_WARNING. Les séquences UTF-8 de cinq et six octets sont considérées comme invalide depuis PHP 5.3.4 (soit PCRE 7.3 2007-08-28); elles étaient considérées comme valide précédemment.