dams Wed Feb 7 01:12:14 2001 EDT Modified files: /phpdoc/fr/functions pcre.xml Log: Updated from list's diff.corrected some typo
Index: phpdoc/fr/functions/pcre.xml diff -u phpdoc/fr/functions/pcre.xml:1.14 phpdoc/fr/functions/pcre.xml:1.15 --- phpdoc/fr/functions/pcre.xml:1.14 Sat Feb 3 16:33:28 2001 +++ phpdoc/fr/functions/pcre.xml Wed Feb 7 01:12:13 2001 @@ -7,7 +7,7 @@ fort à celle de Perl. Les expressions seront entourées de délimiteurs, slash (/), par exemple. N'importe quel caractère peut servir de délimiteur, tant qu'il - n'est pas alphanumérique ou n'est pas un antislash (\). + n'est pas alpha-numérique ou n'est pas un antislash (\). Si un délimiteur doit être utilisé dans l'expression, il faudra l'échapper avec un antislash. Depuis PHP 4.0.4, vous pouvez utiliser les délimiteurs @@ -15,17 +15,17 @@ </para> <para> Le délimiteur final peut être suivi d'options qui - affecteront la recherche. - <link linkend="pcre.pattern.modifiers">Options de recherche</link>. + affecteront la recherche. Voir aussi + <link linkend="pcre.pattern.modifiers">options de recherche</link>. </para> <para> <example> <title>Exemples de masques valides</title> <itemizedlist> - <listitem><simpara>/<\/\w+>/</simpara></listitem> - <listitem><simpara>|(\d{3})-\d+|Sm</simpara></listitem> - <listitem><simpara>/^(?i)php[34]/</simpara></listitem> - <listitem><simpara>{^\s+(\s+)?$}</simpara></listitem> + <listitem><simpara><literal>/<\/\w+>/</literal></simpara></listitem> + <listitem><simpara><literal>|(\d{3})-\d+|Sm</literal></simpara></listitem> + <listitem><simpara><literal>/^(?i)php[34]/</literal></simpara></listitem> + <listitem><simpara><literal>{^\s+(\s+)?$}</literal></simpara></listitem> </itemizedlist> </example> </para> @@ -87,8 +87,8 @@ etc.. </para> <para> - <function>preg_match</function> retourne <literal>TRUE</literal> si la - recherche réussit, et <literal>FALSE</literal> sinon (notamment + <function>preg_match</function> retourne <literal>TRUE</literal> si la + recherche réussit, et <literal>FALSE</literal> sinon (notamment en cas d'erreur). </para> <para> @@ -204,8 +204,8 @@ </computeroutput> </literallayout> </informalexample> - Ainsi, $out[0] est un tableau qui contient les résultats qui - satisfont le masque complet, et $out[1] est un tableau qui contient + Ainsi, $out[0] est un tableau qui contient les résultats qui + satisfont le masque complet, et $out[1] est un tableau qui contient les balises entre > et <. </para> </listitem> @@ -331,17 +331,17 @@ résultats par <parameter>replacement</parameter>. </para> <para> - <parameter>replacement</parameter> peut contenir des références - de la forme <literal>\\<replaceable>n</replaceable></literal> ou, - depuis PHP 4.0.4) <literal><replaceable>$n</replaceable></literal>. - Cette dernière forme est recommandée. Ces - références seront remplacées par le texte capturé - par la <replaceable>n</replaceable>'-ième parenthèse capturante + <parameter>replacement</parameter> peut contenir des références + de la forme <literal>\\<replaceable>n</replaceable></literal> ou, + depuis PHP 4.0.4) <literal><replaceable>$n</replaceable></literal>. + Cette dernière forme est recommandée. Ces + références seront remplacées par le texte capturé + par la <replaceable>n</replaceable>'-ième parenthèse capturante du masque. <replaceable>n</replaceable> peut prendre des valeurs de 0 à - 99, et <literal>\\0</literal> ou <literal>$0</literal>, correspondent - au texte de qui satisfait le masque complet. Les parenthèses - ouvrantes sont comptées de gauche à droite (en commencant - à 1) pour déterminer le numéro de parenthèse + 99, et <literal>\\0</literal> ou <literal>$0</literal>, correspondent + au texte de qui satisfait le masque complet. Les parenthèses + ouvrantes sont comptées de gauche à droite (en commencant + à 1) pour déterminer le numéro de parenthèse capturante. </para> <para> @@ -361,7 +361,7 @@ Si <parameter>pattern</parameter> et <parameter>replacement</parameter> sont des tableaux, alors <function>preg_replace</function> prend une valeur de chaque tableau, et l'utilise pour faire la recherche et le remplacement. - Si <parameter>replacement</parameter> a moins d'éléments + Si <parameter>replacement</parameter> à moins d'éléments que <parameter>pattern</parameter>, alors la chaîne vide est utilisé pour le reste des valeurs. Si <parameter>pattern</parameter> est un tableau, et que <parameter>replacement</parameter> est une @@ -536,7 +536,7 @@ <refnamediv> <refname>preg_quote</refname> <refpurpose> - Echappement des caractères spéciaux des expressions + Echappement des caractères spéciaux des expressions régulières. </refpurpose> </refnamediv> @@ -617,9 +617,9 @@ </para> <para> Depuis PHP 4.0.4, le tableau retourné par <function>preg_grep</function> - est indexé en utilisant les clés issues du tableau - <parameter>input</parameter>. Si ces clés sont inutiles, utilisez - la fonction <function>array_values</function> sur le tableau retourné + est indexé en utilisant les clés issues du tableau + <parameter>input</parameter>. Si ces clés sont inutiles, utilisez + la fonction <function>array_values</function> sur le tableau retourné par <function>preg_grep</function> pour obtenir le comportement traditionnel. </para> <para> @@ -669,11 +669,11 @@ valable qu'une seule fois, au début de la ligne, et le méta caractère "fin de ligne " ($) ne sera valable qu'à la fin de la chaîne, ou avant le retour chariot - final (à moins que l'option E ne soit mise). C'est le + final (à moins que l'option E ne soit activée). C'est le même fonctionnement qu'en Perl. </simpara> <simpara> - Lorsque cette option est mise, " début de ligne " et + 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 @@ -693,7 +693,7 @@ 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ère + à 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. @@ -706,9 +706,9 @@ <simpara> 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ère, + 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ère, et le prochain + 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, @@ -740,16 +740,16 @@ <term><emphasis>F</emphasis></term> <listitem> <simpara> - Avec cette option, <function>preg_replace</function> considère - le paramètre de remplacement comme un nom de fonction, qui doit - être appelé pour fournir la chaîne de remplacement. + Avec cette option, <function>preg_replace</function> considère + le paramètre de remplacement comme un nom de fonction, qui doit + être appelé pour fournir la chaîne de remplacement. La fonction recoit un tableau d'éléments trouvés. - Cette option ne peut pas être utilisée avec l'option + Cette option ne peut pas être utilisée avec l'option <literal>/e</literal>. </simpara> <simpara> <function>preg_replace</function> seuelement utilise cette option. - Elle est ignorée par les autres fonctions PCRE. Cette option a + Elle est ignorée par les autres fonctions PCRE. Cette option a été ajoutée en PHP 4.0.4. </simpara> </listitem> @@ -777,7 +777,7 @@ 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 - <emphasis>m</emphasis> est mise. Il n'y a pas d'équivalent en Perl. + <emphasis>m</emphasis> est activée. Il n'y a pas d'équivalent +en Perl. </simpara> </listitem> </varlistentry> @@ -802,9 +802,10 @@ Cette option inverse la tendance à la gourmandise des expressions régulières. Vous pouvez aussi inverser cette tendance au coup par coup avec un ?. De même, si - cette option est mise, le ? rendra gourmand une séquence. - Cette option n'est pas compatible avec Perl. Elle peut aussi - être mise dans le masque avec l'option (?U). + cette option est activée, le <literal>?</literal> rendra + gourmand une séquence. Cette option n'est pas compatible + avec Perl. Elle peut aussi être mise dans le masque avec + l'option <literal>?U</literal>. </simpara> </listitem> </varlistentry> @@ -837,14 +838,14 @@ </refnamediv> <refsect1> <title>Description</title> - <literallayout> + <para> La bibliothèque PCRE est un ensemble de fonctions qui implémentent la recherche par expressions régulières, en utilisant la même syntaxe et la même sémantique que le Perl 5, avec quelques nuances (voir ci-dessous). L'implémentation actuelle est celle de Perl 5.005. - </literallayout> + </para> </refsect1> <refsect1> <title>Différences avec Perl</title> @@ -951,21 +952,25 @@ </listitem> <listitem> <simpara> - (b) Si PCRE_DOLLAR_ENDONLY est mis, et que PCRE_MULTILINE n'est pas mis, - le méta caractère $ ne s'applique qu'à la fin + (b) Si <link linkend="pcre.pattern.modifiers">PCRE_DOLLAR_ENDONLY</link> est + activé, et que <link +linkend="pcre.pattern.modifiers">PCRE_MULTILINE</link> + n'est pas activé, le méta caractère + <literal>$</literal> ne s'applique qu'à la fin physqiue de la chaîne, et non pas avant les caractères de nouvelle ligne. </simpara> </listitem> <listitem> <simpara> - (c) Si PCRE_EXTRA est mis, un antislash suivi d'une lettre sans signification + (c) Si <link linkend="pcre.pattern.modifiers">PCRE_EXTRA</link> est + activé, un antislash suivi d'une lettre sans signification spéciale est considérée comme une erreur. </simpara> </listitem> <listitem> <simpara> - (d) SI PCRE_UNGREEDY est mis, la "gourmandise" des quantificateurs de + (d) SI <link linkend="pcre.pattern.modifiers">PCRE_UNGREEDY</link> est + activé, la "gourmandise" des quantificateurs de répétition est inversées, ce qui est rend non gourmand par défaut, mais si ils sont suivis de ?, il seront gourmands. @@ -979,762 +984,1628 @@ </refsect1> <refsect1 id="regexp.reference"> <title>Détails sur les expressions régulières</title> - <literallayout> - La syntaxe et la sémantique des expressions régulière - supportées par PCRE sont décrites ci-dessous. Les expressions - régulières sont aussi décrites dans la documentation - Perl, et dans un grand nombre d'autres livres, avec de nombreux exemples. - Jeffrey Friedl's "Mastering Regular Expressions", édité - chez O'Reilly (ISBN 1-56592-257-3), les décrits en profondeur. - Cette description est organisée comme une documentation de - référence. - Une expression régulière est un masque, qui est appliqué - sur une chaîne sujet, de gauche à droite. La plus part des - caractères se représentent eux-mêmes. Un exemple trivial : un masque qui serait - Le rapide renard gris - Pourra correspondre à une partie de la chaîne sujet qui sera identique au masque. - La puissance des expressions régulières provient de leur capacité à autoriser des - alternatives et des quantificateur de répétitions dans le masque. Ils sont encodés - dans le masque par des <emphasis>meta</emphasis>-<emphasis>characters</emphasis>, - qui ne représentent pas ce qu'ils sont, mais sont interprétés d'une certaine + <refsect2> + <title>Introduction</title> + <simpara> + La syntaxe et la sémantique des expressions régulière + supportées par PCRE sont décrites ci-dessous. Les expressions + régulières sont aussi décrites dans la documentation + Perl, et dans un grand nombre d'autres livres, avec de nombreux exemples. + Jeffrey Friedl's "Mastering Regular Expressions", édité + chez O'Reilly (ISBN 1-56592-257-3), les décrits en profondeur. + Cette description est organisée comme une documentation de + référence. + </simpara> + <simpara> + Une expression régulière est un masque, appliqué à + une chaîne sujet, de gauche à droite. La plus part des + caractères se représentent eux-mêmes. Un exemple + trivial : un masque qui serait "<literal>Le rapide renard gris</literal>", + pourra correspondre à une partie de la chaîne sujet qui sera + identique au masque, comme par exemple + "<literal>Le rapide renard gris court dans la forêt</literal>", + </simpara> + </refsect2> + <refsect2 id="regexp.reference.meta"> + <title>Méta-caractères</title> + <para> + La puissance des expressions régulières provient de + leur capacité à autoriser des alternatives et des quantificateurs + de répétition dans le masque. Ils sont encodés + dans le masque par des méta-caractères, qui ne +représentent + pas ce qu'ils sont, mais sont interprétés d'une certaine manière. - Il y a deux sortes de méta-caractères : ceux qui sont reconnus n'importe oú dans - un masque, hormis entre crochets, et ceux qui sont reconnus entre crochets. A - l'extérieur des crochets, les méta caractères sont : - \ Caractère d'échappement, avec de multiples usages. - ^ Le début de la chaîne sujet (ou de ligne, en mode multiligne) - $ La fin de la chaîne sujet (ou de ligne, en mode multiligne) - . Remplace n'importe quel caractère, hormis le caractère de nouvelle ligne - (par défaut) ; - [ Caractère de début de définition de classe - ] Caractère de fin de définition de classe - | Caractère de début d'alternative - ( Caractère de début de sous-masque - ) Caractère de fin de sous-masque - ? Etend le sens de ( - mais aussi quantificateur de 0 ou 1 - mais aussi quantificateur de minimisation - * Quantificateur de 0 ou plus - + Quantificateur de 1 ou plus - { Caractère de début de quantificateur minimum/maximum - La partie du masque qui est entourée de crochet et appelé une classe de caractères. Dans les classes de caractères, les seul méta caractères autorisés sont - \ Caractère d'échappement, avec de multiples usages - ^ négation de la classe, mais uniquement si placé tout au début de la - classe - - indique un intervalle de caractères - ] termine la classe de caractères - La section suivante décrit l'utilisation de chaque méta caractères : -ANTISLASH - Le caractère antislash a de nombreuses utilisations. En premier - lieu, s'il est suivi d'un caractère non alpha numérique, - il ne prendra pas la signification spéciale qui y est - rattachée. Cette utilisation de l'antislash comme - caractère d'échappement s'applique à - l'intérieur et à l'extérieur des classes - de caractères. Par exemple, pour recherche le caractère - étoile "*", il faut écrire dans le masque : "\*". Cela + </para> + <para> + Il y a deux sortes de méta-caractères : ceux qui sont + reconnus n'importe oú dans un masque, hormis entre crochets, + et ceux qui sont reconnus entre crochets. + </para> + <para> + A l'extérieur des crochets, les méta caractères sont : + <variablelist> + <varlistentry> + <term><emphasis>/</emphasis> antislash</term> + <listitem> + <simpara> + Caractère d'échappement, avec de multiples usages + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>^</emphasis> Accent circonflexe</term> + <listitem> + <simpara> + Le début de la chaîne sujet (ou de ligne, en mode +multiligne) + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>$</emphasis> Dollar</term> + <listitem> + <simpara> + La fin de la chaîne sujet (ou de ligne, en mode multiligne) + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>.</emphasis> Point</term> + <listitem> + <simpara> + Remplace n'importe quel caractère, hormis le caractère + de nouvelle ligne (par défaut) ; + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>[</emphasis> Crochet ouvrant</term> + <listitem> + <simpara> + Caractère de début de définition de classe + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>]</emphasis> Crochet fermant</term> + <listitem> + <simpara> + Caractère de fin de définition de classe + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>|</emphasis> Barre verticale</term> + <listitem> + <simpara> + Caractère de début d'alternative + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>(</emphasis> Parenthèse ouvrante</term> + <listitem> + <simpara> + Caractère de début de sous-masque + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>)</emphasis> Parenthèse fermante</term> + <listitem> + <simpara> + Caractère de fin de sous-masque + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>?</emphasis> Point d'interrogation</term> + <listitem> + <simpara> + Etend le sens de (; quantificateur de 0 ou 1; quantificateur de +minimisation + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>*</emphasis> Etoile</term> + <listitem> + <simpara> + Quantificateur de 0 ou plus + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>+</emphasis> Plus</term> + <listitem> + <simpara> + Quantificateur de 1 ou plus + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>{</emphasis> Accolade ouvrante</term> + <listitem> + <simpara> + Caractère de début de quantificateur minimum/maximum + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>}</emphasis> Accolade fermante</term> + <listitem> + <simpara> + Caractère de fin de quantificateur minimum/maximum + </simpara> + </listitem> + </varlistentry> + </variablelist> + </para> + <para> + La partie du masque qui est entourée de crochet et appelé + une classe de caractères. Dans les classes de caractères, + les seuls méta caractères autorisés sont : + <variablelist> + <varlistentry> + <term><emphasis>\</emphasis> Antislash</term> + <listitem> + <simpara> + Caractère d'échappement, avec de multiples usages + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>^</emphasis> Accent circonflexe</term> + <listitem> + <simpara> + Négation de la classe, mais uniquement si placé tout + au début de la classe + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>-</emphasis> Moins</term> + <listitem> + <simpara> + Indique un intervalle de caractères + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>]</emphasis> Crochet fermant</term> + <listitem> + <simpara> + Termine la classe de caractères + </simpara> + </listitem> + </varlistentry> + </variablelist> + La section suivante décrit l'utilisation de chaque + méta-caractères. + </para> + </refsect2> + <refsect2 id="regexp.reference.antislash"> + <title>Antislash</title> + <para> + Le caractère antislash a de nombreuses utilisations. + </para> + <para> + En premier lieu, s'il est suivi d'un caractère non + alpha-numérique, il ne prendra pas la signification + spéciale qui y est rattachée. Cette utilisation de + l'antislash comme caractère d'échappement s'applique + à l'intérieur et à l'extérieur des + classes de caractères. Par exemple, pour recherche le + caractère étoile "<literal>*</literal>", il faut + écrire dans le masque : "<literal>\*</literal>". Cela s'applique dans tous les cas, que le caractère qui suive soit un méta-caractère ou non. C'est un moyen sûr - pour s'assurer qu'un caractère sera recherché pour sa valeur - litérale, plutot que pour sa valeur spéciale. En - particulier, pour rechercher les antislash, il faut écrire : "\\". - Si un masque est utilisé avec l'option PCRE_EXTENDED, les espaces - blancs du masque, mais qui ne sont pas dans une classe de caractères, - et les caractères entre dièses "#", ainsi que les nouvelles - lignes sont ignorées. L'antislash peut être utilisé - pour échapper et ainsi rechercher un espace ou un dièse. - La deuxième utilité de l'antislash est de pouvoir coder des - caractères invisibles dans les masques. Il n'y a pas de restriction - sur la place de ces caractères invisibles, hormis pour le - caractère nul qui doit terminer le masque. Lors de la - préparation du masque, il est souvent plus pratique d'utiliser - les séquences d'échappement suivantes, plutôt que - le caractère binaire qu'elle représente : - \a alarme, c'est à dire le caractère BEL (hex 07) - \cx "control-x", avec x qui peut être n'importe quel caractère. - \e escape (hex 1B) - \f formfeed (hex 0C) - \n nouvelle ligne (hex 0A) - \r retour chariot (hex 0D) - \t tabulation (hex 09) - \xhh caractère en hexadécimal, de code hh - \ddd caractère en octal, de code ddd, ou référence arrière - Dans la séquence "\cx" si "x" est en minuscule, il est converti en majuscule. - Puis, le bit 6 (hex 40) est inversé. Ainsi "\cz" devient 1A, mais "\c{" devient - hex 3B, tandis que "\c;" devient hex 7B. - Après "\x", deux caractères hexadécimaeux sont lus (les lettres peuvent être en - majuscule ou minuscule). - Après "\0", deux caractères octal sont lus. Dans chacun des cas, le - méta-caractère tente de lire autant de caractère que possible. Ainsi la séquence - "\0\x\07", sera comprise comme deux caractères nuls, suivi d'un caractère alarme - (BEL). Assurez vous que vous fournissez suffisamment de chiffres après le - méta-caractère. - La gestion de la séquence "\y", avec y <> 0 est plutot compliquée. En dehors - des caractères de classes, PCRE va lire y et tous les caractères qui suivent - comme des chiffres décimaux. Si y est plus petit que 10, ou bien si il y a déjà - eu au moins autant de parenthèses ouvrantes auparavant, la séquence est prise - pour une <emphasis>référence de retour</emphasis>. Le détail sera vu ultérieurement, - après la section sur les sous-masques. - A l'intérieur d'un caractère de classe, ou si y est plus grand que 10, et qu'il - n'y a pas eu assez de parenthèses ouvrantes auparavant, PCRE lis jusqu'à 3 - chiffres octals à la suite de l'antislash, et génére un octet unique, à partir - des 8 bits de poids faible de la séquence. Tous les chiffres qui suivent ne sont - pas interprétés, et se representent eux-mêmes. Par exemple, - \040 est une autre manière d'écrire un espace - \40 est identique, dans la mesure oú il n'y a pas 40 parenthèses - ouvrantes auparavant. - \7 est toujours une référence de retour. - \11 peut être une référence de retour, ou une tabulation, tandis que - \011 est toujours une tabulation - \011 est toujours une tabulation - \0113 est une tabulation suivi du caractère "3" - \113 est le caractère 113 (étant donné qu'il ne peut y avoir plus de - 99 référence de arrière) - \377 est un octet dont tous les bits sont à 1 - \81 peut être soit une référence de arrière, soit le caractère NULL, suivi des - caractères "8" et "1" - Les valeurs octales supérieures ou égales à 100 ne doivent pas être introduite - par un 0, car seuls les trois premiers octets seront lus. - Toutes les séquences qui définissent une valeur d'un seul octet peuvent être - utilisé dans les classes de caractères, et à l'extérieur. De plus, dans une - classe de caractère, la séquence "\b" est interprétée comme un caractère effacer - (backspace, hex 08). A l'extérieur d'une classe de caractères, il peut avoir - d'autres significations (voir ci-dessous). - On peut encore se servir de l'antislash pour préciser des types génériques de - valeurs : - \d tout caractère décimal - \D tout caractère qui n'est pas un caractère décimal - \s tout caractère blanc - \S tout caractère qui n'est pas un caractère blanc - \w tout caractère de "mot" - \W tout caractère qui n'est pas un caractère de "mot" - Chaque paire précédente définit une partition de la table des caractères : - les deux ensembles sont disjoints. Un caractère satisfera soit un méta-caractère, + pour s'assurer qu'un caractère sera recherché + pour sa valeur litérale, plutôt que pour sa valeur + spéciale. En particulier, pour rechercher les antislash, + il faut écrire : "<literal>\\</literal>". + </para> + <para> + Si un masque est utilisé avec l'option PCRE_EXTENDED, + les espaces blancs du masque, mais qui ne sont pas dans une + classe de caractères, et les caractères entre dièses + "<literal>#</literal>", ainsi que les nouvelles lignes sont ignorées. + L'antislash peut être utilisé pour échapper et ainsi + rechercher un espace ou un dièse. + </para> + <para> + La deuxième utilité de l'antislash est de pouvoir + coder des caractères invisibles dans les masques. Il n'y + a pas de restriction sur la place de ces caractères + invisibles, hormis pour le caractère nul qui doit terminer + le masque. + </para> + <para> + Lors de la préparation du masque, il est souvent plus pratique + d'utiliser les séquences d'échappement suivantes, + plutôt que le caractère binaire qu'elle représente : + <variablelist> + <varlistentry> + <term><emphasis>\a</emphasis></term> + <listitem> + <simpara> + alarme, c'est à dire le caractère BEL (hex 07) + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\cx</emphasis></term> + <listitem> + <simpara> + "control-x", avec x qui peut être n'importe quel caractère. + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\e</emphasis></term> + <listitem> + <simpara> + escape (hex 1B) + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\f</emphasis></term> + <listitem> + <simpara> + formfeed (hex 0C) + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\n</emphasis></term> + <listitem> + <simpara> + nouvelle ligne (hex 0A) + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\r</emphasis></term> + <listitem> + <simpara> + retour chariot (hex 0D) + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\t</emphasis></term> + <listitem> + <simpara> + tabulation (hex 09) + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\xhh</emphasis></term> + <listitem> + <simpara> + caractère en hexadécimal, de code hh + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\ddd</emphasis></term> + <listitem> + <simpara> + caractère en octal, de code ddd, ou référence +arrière + </simpara> + </listitem> + </varlistentry> + </variablelist> + </para> + <para> + Dans la séquence "<literal>\cx</literal>" si "<literal>x</literal>" + est en minuscule, il est converti en majuscule. Puis, le bit 6 (hex 40) + est inversé. Ainsi "<literal>\cz</literal>" devient +<literal>1A</literal>, + mais "<literal>\c{</literal>" devient hex 3B, tandis que +"<literal>\c;</literal>" + devient hex 7B. + </para> + <para> + Après "<literal>\x</literal>", deux caractères + hexadécimaeux sont lus (les lettres peuvent être en majuscule + ou minuscule). + </para> + <para> + Après "<literal>\0</literal>", deux caractères octal sont lus. + Dans chacun des cas, le méta-caractère tente de lire autant + de caractère que possible. Ainsi la séquence + "<literal>\0\x\07</literal>", sera comprise comme deux caractères nuls, + suivi d'un caractère alarme (BEL). Assurez vous que vous fournissez + suffisamment de chiffres après le méta-caractère. + </para> + <para> + La gestion de la séquence "<literal>\y</literal>", avec y <> 0 + est plutôt compliquée. En dehors des caractères de classes, + PCRE va lire y et tous les caractères qui suivent comme des chiffres + décimaux. Si y est plus petit que 10, ou bien si il y a + déjà eu au moins autant de parenthèses ouvrantes + auparavant, la séquence est prise pour une référence + arrière. Le détail sera vu ultérieurement, après la + section sur les sous-masques. + </para> + <para> + A l'intérieur d'un caractère de classe, ou si y est plus + grand que 10, et qu'il n'y a pas eu assez de parenthèses ouvrantes + auparavant, PCRE lis jusqu'à 3 chiffres octals à la suite + de l'antislash, et génére un octet unique, à partir + des 8 bits de poids faible de la séquence. Tous les chiffres qui + suivent ne sont pas interprétés, et se representent + eux-mêmes. Par exemple: + <variablelist> + <varlistentry> + <term><emphasis>\040</emphasis></term> + <listitem> + <simpara> + une autre manière d'écrire un espace + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\40</emphasis></term> + <listitem> + <simpara> + identique, dans la mesure oú il n'y a pas 40 parenthèses + ouvrantes auparavant + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\7</emphasis></term> + <listitem> + <simpara> + est toujours une référence arrière + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\11</emphasis></term> + <listitem> + <simpara> + peut être une référence de retour, ou une +tabulation, tandis que + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\011</emphasis></term> + <listitem> + <simpara> + toujours une tabulation + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\0113</emphasis></term> + <listitem> + <simpara> + est une tabulation suivi du caractère "3" + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\113</emphasis></term> + <listitem> + <simpara> + est le caractère 113 (étant donné qu'il ne + peut y avoir plus de 99 références arrières) + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\377</emphasis></term> + <listitem> + <simpara> + est un octet dont tous les bits sont à 1 + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\0113</emphasis></term> + <listitem> + <simpara> + peut être soit une référence arrière, + soit le caractère NULL, suivi des caractères "8" et "1" + </simpara> + </listitem> + </varlistentry> + </variablelist> + </para> + <para> + Les valeurs octales supérieures ou égales à 100 ne + doivent pas être introduites par un 0, car seuls les trois premiers + octets seront lus. + </para> + <para> + Toutes les séquences qui définissent une valeur d'un seul + octet peuvent être utilisé dans les classes de caractères, + et à l'extérieur. De plus, dans une classe de caractères, + la séquence "<literal>\b</literal>" est interprétée + comme un caractère effacer (backspace, hex 08). A l'extérieur + d'une classe de caractères, il peut avoir d'autres significations + (voir ci-dessous). + </para> + <para> + On peut encore se servir de l'antislash pour préciser des types + génériques de valeurs : + <variablelist> + <varlistentry> + <term><emphasis>\d</emphasis></term> + <listitem> + <simpara> + tout caractère décimal + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\D</emphasis></term> + <listitem> + <simpara> + tout caractère qui n'est pas un caractère décimal + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\S</emphasis></term> + <listitem> + <simpara> + tout caractère blanc + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\s</emphasis></term> + <listitem> + <simpara> + tout caractère qui n'est pas un caractère blanc + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\W</emphasis></term> + <listitem> + <simpara> + tout caractère de "mot" + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\w</emphasis></term> + <listitem> + <simpara> + tout caractère qui n'est pas un caractère de "mot" + </simpara> + </listitem> + </varlistentry> + </variablelist> + </para> + <para> + Chaque paire précédente définit une partition de + la table des caractères : les deux ensembles sont disjoints. + Un caractère satisfera soit un méta-caractère, soit l'autre. - Un caractère de "mot" sera une lettre, un chiffre ou le caractère souligné, - c'est à dire un caractère qui pourra être une partie d'un mot Perl. La - définition des lettres et chiffres est définie par les tables de caractères de - PCRE, et peut varier suivant la table locale de caractère (voir "Tables de - caractères locales ", ci-dessus. Par exemple, dans la configuration français ("fr"), - certains caractères ont des codes supérieurs à 128, pour les caractères accentués, - et ils seront compris par le méta caractère \w. - Ces séquences de caractères peuvent apparaître à l'intérieur ou à l'extérieur des - classes de caractères. Elles remplacent à chaque fois un caractère du type - correspondant. Si cette séquence est mis en fin de masque, et qu'il n'y a plus - de caractère à comparer dans la chaîne sujet, la recherche échoue. - La quatrième utilisation de l'antislash intervient lors d'assertions simples. - Une assertion impose une condition à un certain point, sans remplacer de - caractère. L'utilisation de sous-masques pour réaliser des assertions plus - complexes est décrites plus bas. Les assertions avec antislash sont les - suivantes : - \b limite de mot - \B pas limite de mot - \A début de la chaîne sujet (indépendant du mode multi-lignes) - \Z fin de la chaîne sujet ou nouvelle ligne à la fin de la chaîne sujet - (indépendant du mode multi-lignes) - \z fin de la chaîne sujet (indépendant du mode multi-lignes) - Ces assertions ne peuvent pas apparaître dans une classe de caractère - (mais "\b" a une autre signification à l'intérieur d'une classe de caractères). - Une limite de mot est un emplacement dans la chaîne sujet ou un caractère et - son suivant ne sont pas en même temps des caractères de mot, ou le contraire - (on peut le voir comme \w\W ou \W\w), ou encore le premier ou le dernier - caractère est un caractère mot. - Les assertions \A, \Z, et \z diffèrent des méta caractères ^et $ dans la mesure - oú ils ne sont pas dépendants des options, notamment PCRE_NOTBOL ou PCRE_NOTEOL. - La différence entre \Z et \z tient au fait que \Z recherche les positions avant - les nouvelles lignes et à la fin de la chaîne sujet, tandis que \z ne recherche + </para> + <para> + Un caractère de "mot" sera une lettre, un chiffre ou le + caractère souligné, c'est à dire un + caractère qui pourra être une partie d'un mot Perl. La + définition des lettres et chiffres est définie par les + tables de caractères de PCRE, et peut varier suivant la table + locale de caractère (voir "Tables de caractères locales ", + ci-dessus. Par exemple, dans la configuration français ("fr"), + certains caractères ont des codes supérieurs à + 128, pour les caractères accentués, et ils seront compris + par le méta caractère <literal>\w</literal>. + </para> + <para> + Ces séquences de caractères peuvent apparaître à + l'intérieur ou à l'extérieur des classes de + caractères. Elles remplacent à chaque fois un + caractère du type correspondant. Si cette séquence est + placée en fin de masque, et qu'il n'y a plus de caractère +à + comparer dans la chaîne sujet, la recherche échoue. + </para> + <para> + La quatrième utilisation de l'antislash intervient lors d'assertions + simples. Une assertion impose une condition à un certain point, + sans remplacer de caractère. L'utilisation de sous-masques pour + réaliser des assertions plus complexes est décrites + plus-bas. Les assertions avec antislash sont les suivantes : + <variablelist> + <varlistentry> + <term><emphasis>\b</emphasis></term> + <listitem> + <simpara> + limite de mot + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\B</emphasis></term> + <listitem> + <simpara> + pas limite de mot + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\A</emphasis></term> + <listitem> + <simpara> + début de la chaîne sujet + (indépendant du mode multi-lignes) + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\Z</emphasis></term> + <listitem> + <simpara> + fin de la chaîne sujet ou nouvelle ligne à + la fin de la chaîne sujet + (indépendant du mode multi-lignes) + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\z</emphasis></term> + <listitem> + <simpara> + fin de la chaîne sujet + (indépendant du mode multi-lignes) + </simpara> + </listitem> + </varlistentry> + </variablelist> + </para> + <para> + Ces assertions ne peuvent pas apparaître dans une classe de + caractères (mais "\b" a une autre signification à + l'intérieur d'une classe de caractères). + </para> + <para> + Une limite de mot est un emplacement dans la chaîne sujet ou un + caractère et son suivant ne sont pas en même temps des + caractères de mot, ou le contraire (on peut le voir comme + <literal>\w\W</literal> ou <literal>\W\w</literal>), ou encore le + premier ou le dernier caractère est un caractère mot. + </para> + <para> + Les assertions <literal>\A</literal>, <literal>\Z</literal>, et + <literal>\z</literal> diffèrent des méta caractères + <literal>^</literal> et <literal>$</literal> dans la mesure oú + ils ne sont pas dépendants des options, notamment PCRE_NOTBOL + ou PCRE_NOTEOL. La différence entre <literal>\Z</literal> et + <literal>\z</literal> tient au fait que <literal>\Z</literal> recherche + les positions avant les nouvelles lignes et à la fin de la + chaîne sujet, tandis que <literal>\z</literal> ne recherche que la fin de la chaîne. -CIRCUMFLEX et DOLLAR - En dehors d'une classe de caractère, avec les options par défaut, - ^ est une assertion qui n'est vraie que si elle est placée tout au début de la - chaîne. A l'intérieur d'une classe de caractère, ^a un tout autre sens (voir - ci-dessous). - ^ n'a pas besoin d'être le premier caractère du masque, si plusieurs alternatives - sont proposées, mais il doit être placé en premier dans chaque alternative. - Si toutes les alternatives commencent par ^, alors le masque est dit ancré + </para> + </refsect2> + <refsect2 id="regexp.reference.circudollar"> + <title>Accent circonflexe et Dollar</title> + <para> + En dehors d'une classe de caractères, avec les options par + défaut, <literal>^</literal> est une assertion qui n'est + vraie que si elle est placée tout au début de la + chaîne. A l'intérieur d'une classe de caractères, + <literal>^</literal> a un tout autre sens (voir ci-dessous). + </para> + <para> + <literal>^</literal> n'a pas besoin d'être le premier + caractère du masque, si plusieurs alternatives sont + proposées, mais il doit être placé en + premier dans chaque alternative. Si toutes les alternatives + commencent par <literal>^</literal>, alors le masque est dit ancré (il y a une autre construction qui porte cette appellation). - $ est une assertion qui n'est vraie que si elle est placée tout en fin de chaîne - ou juste avant un caractère de nouvelle ligne qui serait le dernier caractère de - la chaîne. A l'intérieur d'une classe de caractère, ^a un tout autre sens (voir - ci-dessous). - $ n'a pas besoin d'être le dernier caractère du masque, si plusieurs alternatives - sont proposées, mais il doit être placé en dernier dans chaque alternative. Si - toutes les alternatives finissent par $, alors le masque est dit ancré (il y - a une autre construction qui porte cette appellation). $ n'a pas de valeur particulière - dans une classe de caractères. - La signification de $ peut changer, de manière à l'amener à ce qu'il ne puisse se - trouver qu'en toute fin de la chaîne sujet. Cela se fait en ajoutant l'option - PCRE_DOLLAR_ENDONLY au moment de la compilation, ou de l'exécution. Cette option - est inopérante sur \Z. - La signification de ^ peut changer, de manière à l'amener à ce qu'il puisse se - trouver immédiatement avant et immédiatement après un caractère de nouvelle ligne - "\n". Cela se fait en ajoutant l'option PCRE_MULTILINE au moment de la compilation, - ou de l'exécution. Par exemple, le masque /^abc$/ accepte la chaîne "def\nabc" - uniquement en mode multi-lignes. Par conséquent, toutes les parties du masques qui - commencent par "^" ne sont pas ancrées, en mode multi ligne. L'option - PCRE_DOLLAR_ENDONLY est ignorée si l'option PCRE_MULTILINE est choisie. - Notez que les méta caractères \A, \Z, et \z peuvent servir à répérer le début et - la fin du sujet, et toutes les parties du masque qui commenceront par \A seront - toujours ancrées, avec l'option PCRE_MULTILINE ou non. -FULL STOP (PERIOD, DOT) - En dehors d'une classe de caractères, un point remplace n'importe quel caractère, - même invisible et à l'exception du caractère de nouvelle ligne. Avec l'option - PCRE_DOTALL le point remplace n'importe quel caractère, même le caractère de - nouvelle ligne. La gestion des points et complètement indépendante de ^et $. - Le seul point commun est que les deux ont un comportement particulier vis à vis - des caractère de nouvelle ligne. Le point n'a pas de comportement particulier - dans une classe de caractères. -SQUARE BRACKETS - Un crochet ouvrant introduit une classe de caractère, et le crochet fermant la - conclut. Le crochet fermant n'a pas de signification en lui même. Si le crochet - fermant est nécessaire à l'intérieur d'une classe de caractères, il faut qu'il - soit le premier caractère (après un ^ éventuel) ou échappé avec un antislash. - Une classe de caractère remplace un seul caractère dans la chaîne sujet, à moins - que le premier caractère de la classe soit un ^, qui représente une négation : - le caractère ne doit pas se trouver dans la classe. Si ^ est nécessaire dans la - classe, il suffit qu'il ne soit pas le premier caractère, ou bien qu'il soit - échappé avec un antislash. - Par exemple, le caractère [aeiou] remplace n'importe quelle voyelle minuscule, - tandis que [^aeiou] remplace n'importe quelle caractère qui n'est pas une voyelle - minuscule. ^ est une notation pratique pour spécifier des caractères qui sont - dans une classe, en ne citant que ceux qui n'y sont pas. Le comportement est - inchangé. - Avec l'option d'insensibilité à la casse, toutes les lettres d'une classe de - caractère représentent en même temps la majuscule et la minuscule. Par exemple, - [aeiou] représentera "A" ou "a", et [^aeiou] n'acceptera pas "A", tandis que sans - l'option, elle l'accepterait. - Le caractère de nouvelle ligne n'est pas traité de manière spéciale dans les - classes de caractère, quelque soit l'option PCRE_DOTALL ou PCRE_MULTILINE. - Une classe telle que [^a] acceptera toujours une nouvelle ligne. - Le signe moins (-) est utilisé pour spécifier un intervalle de caractères, dans - une classe. Par exemple, [d-m] remplace toutes les lettres entre d et m inclus. - Si le caractère moins est requis dans une classe, il faut l'échapper avec un - antislash, ou le faire apparaître à une position ou il ne pourra pas être - interprété comme une indication d'intervalle, c'est à dire au début ou à la fin - de la classe. - Il n'est pas possible d'avoir le caractère "]" comme fin d'intervalle. Un masque - tel que [W-]46] est compris comme la classe de caractère contenant deux caractères - ("W" et "-") suivi de la chaîne littérale "46]", ce qui fait qu'il va accepter - "W46]" ou "-46]". Cependant, si "]" est échappé avec un antislash, le masque - [W-\]46] est interprété comme une classe d'un seul caractère, contenant un - intervalle de caractère. La valeur octale ou hexadécimale de "]" peuvent aussi - être utilisée pour déterminer les limites de l'intervalle. - Les intervalles travaillent sur des séquences ASCII. Elles peuvent aussi être - précisées avec des valeurs numériques, par exemple [\000-\037]. Si cet intervalle - inclus des lettres utilisées avec une option d'insensibilité de casse, les - majuscules ou minuscules correspondantes seront aussi incluses. Par exemple, - [W-c] est équivalent é [][\^_`wxyzabc], avec l'option d'insensibilité de casse. - Si la table locale de caractère est "fr", [\xc8-\xcb] correspond aux caractères - accentués. - Les types de caractères \d, \D, \s, \S, \w, et \W peuvent aussi intervenir dans - les classes de caractères. Par exemple, [\dABCDEF] acceptera n'importe quel caractère - hexadécimal. Un accent circonflexe peut aussi être utilisé pour spécifier adroitement - des ensembles de caractères plus restrictifs : par exemple [^\W_] accepte toutes - les lettres et les chiffres, mais pas les soulignés. - Tous les caractères non alphanumériques autres que \, -, ^ (placé en début de chaîne) - et ] n'ont pas de significations particulière, mais ils ne perdront rien à être - échappés. -VERTICAL BAR - La barre verticale sert à séparer des alternatives. Par exemple, dans le masque -dupont|martin - recherche soit "dupont", soit " martin ". Le nombre d'alternative n'est pas - limité, et il est même possible d'utiliser la chaîne vide. Lors de la recherche, - toutes les alternatives sont essayées, de gauche à droit, et la première qui est - acceptée, est utilisée. Si les alternatives sont dans un sous-masque, elle ne - réussiront que si le masque principal réussi aussi. -INTERNAL OPTION SETTING + </para> + <para> + <literal>$</literal> est une assertion qui n'est vraie que si elle + est placée tout en fin de chaîne ou juste avant un + caractère de nouvelle ligne qui serait le dernier + caractère de la chaîne. A l'intérieur d'une + classe de caractères, <literal>$</literal> a un tout autre + sens (voir ci-dessous). + </para> + <para> + <literal>$</literal> n'a pas besoin d'être le dernier + caractère du masque, si plusieurs alternatives sont + proposées, mais il doit être placé en dernier + dans chaque alternative. Si toutes les alternatives finissent par + <literal>$</literal>, alors le masque est dit ancré (il y + a une autre construction qui porte cette appellation). <literal>$</literal> + n'a pas de valeur particulière dans une classe de + caractères. + </para> + <para> + La signification de <literal>$</literal> peut changer, de manière + à l'amener à ce qu'il ne puisse se trouver qu'en toute + fin de la chaîne sujet. Cela se fait en ajoutant l'option + PCRE_DOLLAR_ENDONLY au moment de la compilation, ou de l'exécution. + Cette option est inopérante sur <literal>\Z</literal>. + </para> + <para> + La signification de <literal>^</literal> peut changer, de manière + à l'amener à ce qu'il puisse se trouver immédiatement + avant et immédiatement après un caractère de nouvelle + ligne "<literal>\n</literal>". Cela se fait en ajoutant l'option + PCRE_MULTILINE au moment de la compilation ou de l'exécution. + Par exemple, le masque <literal>/^abc$/</literal> accepte la chaîne + "<literal>def\nabc</literal>" uniquement en mode multi-lignes. Par + conséquent, toutes les parties du masques qui commencent par + "<literal>^</literal>" ne sont pas ancrées, en mode multi-lignes. + L'option PCRE_DOLLAR_ENDONLY est ignorée si l'option + PCRE_MULTILINE est choisie. + </para> + <para> + Notez que les méta caractères <literal>\A</literal>, + <literal>\Z</literal>, et <literal>\z</literal> peuvent servir à + répérer le début et la fin du sujet, et toutes les + parties du masque qui commenceront par <literal>\A</literal> seront toujours + ancrées, avec l'option PCRE_MULTILINE ou non. + </para> + </refsect2> + <refsect2 id="regexp.reference.dot"> + <title>Point</title> + <simpara> + En dehors d'une classe de caractères, un point remplace n'importe + quel caractère, même invisible et à l'exception du + caractère de nouvelle ligne. Avec l'option PCRE_DOTALL le point + remplace n'importe quel caractère, même le caractère de + nouvelle ligne. La gestion des points et complètement + indépendante de <literal>^</literal> et <literal>$</literal>. + Le seul point commun est que les deux ont un comportement particulier vis + à vis des caractère de nouvelle ligne. + </simpara> + <simpara> + Le point n'a pas de comportement particulier dans une classe de + caractères. + </simpara> + </refsect2> + <refsect2 id="regexp.reference.squarebrackets"> + <title>Crochets</title> + <para> + Un crochet ouvrant <literal>[</literal> introduit une classe de + caractères, et le crochet fermant <literal>]</literal>la + conclut. Le crochet fermant n'a pas de signification en lui-même. + Si le crochet fermant est nécessaire à l'intérieur + d'une classe de caractères, il faut qu'il soit le premier + caractère (après un <literal>^</literal> éventuel) + ou échappé avec un antislash. + </para> + <para> + Une classe de caractères remplace un seul caractère + dans la chaîne sujet, à moins que le premier + caractère de la classe soit un accent circonflexe + <literal>^</literal>, qui représente une négation : + le caractère ne doit pas se trouver dans la classe. Si + <literal>^</literal> est nécessaire dans la classe, il + suffit qu'il ne soit pas le premier caractère, ou bien + qu'il soit échappé avec un antislash. + </para> + <para> + Par exemple, le caractère <literal>[aeiou]</literal> remplace + n'importe quelle voyelle minuscule, tandis que <literal>[^aeiou]</literal> + remplace n'importe quelle caractère qui n'est pas une voyelle + minuscule. <literal>^</literal> est une notation pratique pour + spécifier des caractères qui sont dans une classe, + en ne citant que ceux qui n'y sont pas. Le comportement est inchangé. + </para> + <para> + Avec l'option d'insensibilité à la casse, toutes les lettres + d'une classe de caractères représentent en même temps + la majuscule et la minuscule. Par exemple, <literal>[aeiou]</literal> + représentera "<literal>A</literal>" ou "<literal>a</literal>", et + <literal>[^aeiou]</literal> n'acceptera pas ni "<literal>A</literal>", + tandis que sans l'option, elle l'accepterait. + </para> + <para> + Le caractère de nouvelle ligne n'est pas traité de + manière spéciale dans les classes de caractères, + quelque soit l'option PCRE_DOTALL ou PCRE_MULTILINE. Une classe telle que + <literal>[^a]</literal> acceptera toujours une nouvelle ligne. + </para> + <para> + Le signe moins (<literal>-</literal>) est utilisé pour + spécifier un intervalle de caractères, dans + une classe. Par exemple, <literal>[d-m]</literal> remplace toutes + les lettres entre d et m inclus. Si le caractère moins est + requis dans une classe, il faut l'échapper avec un antislash, + ou le faire apparaître à une position ou il ne pourra + pas être interprété comme une indication d'intervalle, + c'est à dire au début ou à la fin de la classe. + </para> + <para> + Il n'est pas possible d'avoir le caractère crochet fermant + "<literal>]</literal>" comme fin d'intervalle. Un masque tel que + <literal>[W-]46]</literal> est compris comme la classe de caractères + contenant deux caractères ("W" et "-") suivi de la chaîne + litérale "46]", ce qui fait qu'il va accepter + "<literal>W46]</literal>" ou "<literal>-46]</literal>". Cependant, si + "<literal>]</literal>" est échappé avec un antislash, le + masque <literal>[W-\]46]</literal> est interprété comme + une classe d'un seul caractère, contenant un intervalle de + caractères. + </para> + <para> + La valeur octale ou hexadécimale de "<literal>]</literal>" peut + aussi être utilisée pour déterminer les limites + de l'intervalle. Les intervalles travaillent sur des + séquences ASCII. Ils peuvent aussi être précisées + avec des valeurs numériques, par exemple +"<literal>[\000-\037]</literal>". + Si cet intervalle inclus des lettres utilisées avec une + option d'insensibilité de casse, les majuscules ou minuscules + correspondantes seront aussi incluses. Par exemple, "<literal>[C-c]</literal>" + est équivalent é "<literal>[][\^_`wxyzabc]</literal>", + avec l'option d'insensibilité de casse. Si la table locale de + caractères est "fr", "<literal>[\xc8-\xcb]</literal>" correspond + aux caractères accentués. + </para> + <para> + Les types de caractères <literal>\d</literal>, + <literal>\D</literal>, <literal>\S</literal>, <literal>\s</literal>, + <literal>\w</literal>, <literal>\W</literal> peuvent aussi intervenir + dans les classes de caractères. Par exemple, + "<literal>[][\^_`wxyzabc][\dABCDEF]</literal>" acceptera n'importe + quel caractère hexadécimal. Un accent circonflexe peut + aussi être utilisé pour spécifier adroitement + des ensembles de caractères plus restrictifs : par exemple + <literal>[^\W_]</literal> accepte toutes les lettres et les chiffres, + mais pas les soulignés. Tous les caractères non alpha- + numériques autres que <literal>\, -, ^</literal> (placés + en début de chaîne) et <literal>]</literal> n'ont pas de + signification particulière, mais ils ne perdront rien à + être échappés. + </para> + </refsect2> + <refsect2 id="regexp.reference.verticalbar"> + <title>Barre verticale</title> + <para> + La barre verticale <literal>|</literal> sert à séparer des + alternatives. Par exemple, dans le masque "<literal>/dupont|martin/</literal>" + recherche soit "<literal>dupont</literal>", soit "<literal>martin</literal>". + Le nombre d'alternatives n'est pas limité, et il est même possible + d'utiliser la chaîne vide. Lors de la recherche, toutes les alternatives + sont essayées, de gauche à droite, et la première qui est + acceptée est utilisée. + </para> + <para> + Si les alternatives sont dans un sous-masque, elle ne réussiront que + si le masque principal réussi aussi. + </para> + </refsect2> + <refsect2 id="regexp.reference.internal_options"> + <title>Options internes</title> + <para> Les options PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, et PCRE_EXTENDED peuvent - être changée depuis le masque lui-même, avec des séquences mises "(?" et ")". - Les options sont -i pour PCRE_CASELESS -m pour PCRE_MULTILINE -s pour PCRE_DOTALL -x pour PCRE_EXTENDED - Par exemple, (?im) rend le masque insensible à la casse, et multi-lignes. Il est - possible d'annuler ces options en les faisant précéder par un signe - : par - exemple (?im-sx), ajoutera les options PCRE_CASELESS et PCRE_MULTILINE mais - annulera les options PCRE_DOTALL et PCRE_EXTENDED. Si une option apparaît avant - et après le signe moins, l'option sera annulée. - Le domaine d'application de ces options dépend de la position de la séquence - d'option. Pour toutes les séquences d'options qui sont hors des sous-masques - (définis plus loin), l'effet est le même que si l'option avait été fixée dès le - début de la recherche. Les exemples suivants se comportent tous de la même - façons : - (?i)abc - a(?i)bc - ab(?i)c - abc(?i) - et sont parfaitement équivalents au masque abc avec l'option PCRE_CASELESS. - En d'autres termes, mettre des séquences d'options dans le corps principal du - masque revient à appliquer l'option à tout le masque, sauf ordre contraire dans - les sous-masques. Si il y a plusieurs séquences d'option qui portent sur la même - optin, la dernière s'appliquera. + être changée à l'intérieur du masque +lui-même, avec des + séquences mises entre "<literal>(?</literal>" et "<literal>)</literal>". + Les options sont : + <variablelist> + <varlistentry> + <term><emphasis>i</emphasis></term> + <listitem> + <simpara> + PCRE_CASELESS + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>m</emphasis></term> + <listitem> + <simpara> + PCRE_MULTILINE + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>s</emphasis></term> + <listitem> + <simpara> + PCRE_DOTALL + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>x</emphasis></term> + <listitem> + <simpara> + PCRE_EXTENDED + </simpara> + </listitem> + </varlistentry> + </variablelist> + Par exemple, <literal>(?im)</literal> rend le masque insensible à + la casse, et multi-lignes. Il est possible d'annuler ces options en les + faisant précéder par un signe <literal>-</literal> : par + exemple <literal>(?im-sx)</literal>, ajoutera les options PCRE_CASELESS + et PCRE_MULTILINE mais annulera les options PCRE_DOTALL et PCRE_EXTENDED. + Si une option apparaît avant et après le signe moins, l'option + sera annulée. + </para> + <para> + Le domaine d'application de ces options dépend de la position de + la séquence d'option. Pour toutes les séquences d'options + qui sont hors des sous-masques (définis plus loin), l'effet est le + même que si l'option avait été fixée dès + le début de la recherche. Les exemples suivants se comportent tous + de la même façons : <literal>(?i)abc</literal>, + <literal>a(?i)bc</literal>, <literal>ab(?i)c</literal>, + <literal>abc(?i)</literal>, et sont parfaitement équivalents au + masque <literal>abc</literal> avec l'option PCRE_CASELESS. En d'autres + termes, activer des séquences d'options dans le corps principal + du masque revient à appliquer l'option à tout le masque, sauf + ordre contraire dans les sous-masques. Si il y a plusieurs séquences + d'options qui portent sur la même option, la dernière +s'appliquera. + </para> + <para> Si une option intervient dans un sous-masque, le comportement est différent. - C'est un changement de comportement apparu en Perl 5.005. Une option à l'intérieur - d'un sous-masque n'affecte que cette partie du masque, ce qui fait que - (a(?i)b)c - acceptera abc et aBc mais aucune autre chaîne (en supposant que PCRE_CASELESS - n'est pas utilisé). Cela signifie que les options permettent d'avoir différente - configuration de recherche pour différentes parties du masque. Une séquence - d'option dans une alternative affecte toute l'alternative. Par exemple : - (a(?i)b|c) - accepte "ab", "aB", "c", et "C", même si, comme dans le cas de "C", la première - alternative qui porte l'option n'est pas prise en compte. Sinon, cela risque - d'introduire des comportements très étranges : - Les options spécifiques à PCRE telles que PCRE_UNGREEDY et PCRE_EXTRA peuvent - être modifiées de la même manière, en utilisant respectivement les caractères - U et X. L'option (?X) est particulière, car elle doit toujours intervenir avant - toutes les autres options, même au niveau du masque entier. Il vaut mieux la - mettre au début du masque. -sous-masques - Les sous-masques sont délimités par des parenthèses, et peuvent être imbriquées. - Ajouter des sous-masques a deux utilités : - 1. Délimiter des alternatives. Par exemple, le masque - cat(aract|erpillar|) - acceptera les mots "char", "chardon", ou "charmant". Sans les parenthèses, il - n'accepterait que "chardon", "mant" ou la chaîne vide. - 2. Le sous-masque est considéré comme capturante : Lorsqu'une - chaîne sujet est acceptée par le masque complet, les sous - masques sont transmis à l'appelant grâce à un vecteur - de sous-masques. Les parenthèses ouvrantes sont comptées de - gauche à droite, (commencant à 1). - Par exemple, soit la chaîne sujet "le roi soleil " qui est - utilisée avec le masque suivant : - Le ((roi|prince) (soleil|charmant)) - les sous-masques capturé sont "roi soleil ", "roi", et "soleil", numérotés - respectivement 1, 2, et 3. + C'est un changement de comportement apparu en Perl 5.005. Une option à + l'intérieur d'un sous-masque n'affecte que cette partie du masque, ce + qui fait que <literal>(a(?i)b)c</literal> acceptera <literal>abc</literal> + et <literal>aBc</literal> mais aucune autre chaîne (en supposant que + PCRE_CASELESS n'est pas utilisé). Cela signifie que les options + permettent d'avoir différente configuration de recherche pour + différentes parties du masque. + </para> + <para> + Une séquence d'options dans une alternative affecte toute + l'alternative. Par exemple : <literal>(a(?i)b|c)</literal> accepte + "<literal>ab</literal>", "<literal>aB</literal>", "<literal>c</literal>", + et "<literal>C</literal>", même si, comme dans le cas de + "<literal>C</literal>", la première alternative qui porte + l'option n'est pas prise en compte. Sinon, cela risque d'introduire + des comportements très étranges : les options + spécifiques à PCRE telles que PCRE_UNGREEDY et + PCRE_EXTRA peuvent être modifiées de la même + manière, en utilisant respectivement les caractères + U et X. L'option <literal>(?X)</literal> est particulière, + car elle doit toujours intervenir avant toutes les autres options, + même au niveau du masque entier. Il vaut mieux l'activer au + début du masque. + </para> + </refsect2> + <refsect2 id="regexp.reference.subpatterns"> + <title>Sous-masques</title> + <para> + Les sous-masques sont délimités par des parenthèses, + et peuvent être imbriquées. Ajouter des sous-masques a deux + utilités : + </para> + <para> + 1. Délimiter des alternatives. Par exemple, le masque + <literal>char(don|mant|)</literal> acceptera les mots + "<literal>char</literal>", "<literal>charmant</literal>", ou + "<literal>charmant</literal>". Sans les parenthèses, il + n'accepterait que "<literal>chardon</literal>", + "<literal>mant</literal>" ou la chaîne vide "". + </para> + <para> + 2. Le sous-masque est considéré comme capturant : lorsqu'une + chaîne sujet est acceptée par le masque complet, les + sous-masques sont transmis à l'appelant grâce à + un vecteur de sous-masques. Les parenthèses ouvrantes sont + comptées de gauche à droite, (commencant à 1). + Par exemple, soit la chaîne sujet "<literal>le roi soleil</literal>" + qui est utilisée avec le masque suivant : + <literal>Le ((roi|prince) (soleil|charmant))</literal> les sous-masques + capturé sont "<literal>roi soleil</literal>", "<literal>roi</literal>", + et "<literal>soleil</literal>", numérotés respectivement 1, 2, +et 3. + </para> + <para> L'ubiquité des parenthèses n'est pas toujours simple d'emploi. Il y a des moments oú regrouper des sous-masques - est nécessaire, sans pour autant capturer - la valeur trouvée. Si une parenthèse ouvrante est suivie de "?:", le sous-masque - ne capture pas la chaîne assortie, et ne sera pas compté lors de la numérotation - des captures. Par exemple, avec la chaîne "le prince charmant", utilisé avec le - masque pattern - Le (( ?roi|prince) (soleil|charmant)) - les chaînes capturées seront "prince charmant " et "charmant", numérotés - respectivement 1 et 2. Le nombre maximal de chaîne capturées est de 99, et le - nombre total de sous-masque (capturant ou non) ne doit pas dépasser 200. -(?i:samedi|dimanche) -(?:(?i) samedi | dimanche) - De plus, comme les séquences d'options sont valables sur toute une alternative, - le masque ci dessus acceptera aussi "DIMANCHE" que "Dimanche". -REPETITION - les Répétitions sont spécifiées avec des quantificateurs, qui peuvent être placés - à la suite des caractères suivants : - Un caractère unique, même s'il s'agit d'un méta caractère - Une classe de caractères - Une référence de retour (Voir section suivante) - Un sous-masque avec parenthèses (a moins que ce ne soit une assertion, voir plus - loin) - Les quantificateurs généraux précisent un nombre minimum et maximum de répétitions - possibles, donnés par deux nombres entre accolades, et séparés par une virgule. - Ces nombres doivent être plus petit que 65536, et le premier nombre doit être - égal ou inférieur au second. Par exemple - z{2,4} - accepte "zz", "zzz", ou "zzzz". L'accolade fermante n'a pas de signification par - elle même. Si le second nombre est omis, mais que la virgule est là, cela - signifie qu'il n'y a pas de limite supérieure. Si le second nombre et la virgule - sont omis, le quantificateur correspond au nombre exact de répétition attendues. - Par exemple : - [aeiou]{3,} + est nécessaire, sans pour autant capturer la valeur trouvée. + Si une parenthèse ouvrante est suivie de "<literal>?:</literal>", + le sous-masque ne capture pas la chaîne assortie, et ne sera pas + compté lors de la numérotation des captures. Par exemple, + avec la chaîne "<literal>le prince charmant</literal>", utilisé + avec le masque <literal>Le (( ?roi|prince) (soleil|charmant))</literal> + les chaînes capturées seront "<literal>prince charmant</literal>" + et "<literal>charmant</literal>", numérotés respectivement 1 + et 2. + </para> + <para> + Le nombre maximal de chaîne capturées est de 99, et le + nombre total de sous-masque (capturant ou non) ne doit pas + dépasser 200. + </para> + <para> + <literal>(?i:samedi|dimanche)</literal> et + <literal>(?:(?i) samedi | dimanche)</literal> : De plus, comme les + séquences d'options sont valables sur toute une alternative, + les masques ci-dessus accepteront aussi bien "DIMANCHE" que "Dimanche". + </para> + </refsect2> + <refsect2 id="regexp.reference.repetitions"> + <title>Répétitions</title> + <para> + Les répétitions sont spécifiées avec + des quantificateurs, qui peuvent être placés à + la suite des caractères suivants : + <variablelist> + <varlistentry> + <term><emphasis>a</emphasis></term> + <listitem> + <simpara> + Un caractère unique, même s'il s'agit + d'un méta caractère + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>[abc]</emphasis></term> + <listitem> + <simpara> + Une classe de caractères + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>\2</emphasis></term> + <listitem> + <simpara> + Une référence de retour (Voir section suivante) + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>(a|b|c)</emphasis></term> + <listitem> + <simpara> + Un sous-masque avec parenthèses (à moins que ce ne soit + une assertion, voir plus loin) + </simpara> + </listitem> + </varlistentry> + </variablelist> + </para> + <para> + Les quantificateurs généraux précisent un nombre + minimum et maximum de répétitions possibles, donnés + par deux nombres entre accolades, et séparés par une virgule. + Ces nombres doivent être plus petits que 65536, et le premier nombre + doit être égal ou inférieur au second. Par exemple + <literal>z{2,4}</literal> accepte "<literal>zz</literal>", + "<literal>zzz</literal>", ou "<literal>zzzz</literal>". L'accolade fermante + n'a pas de signification par elle même. + </para> + <para> + Si le second nombre est omis, mais que la virgule est là, cela + signifie qu'il n'y a pas de limite supérieure. Si le second nombre + et la virgule sont omis, le quantificateur correspond au nombre exact de + répétition attendues. Par exemple : accepte n'importe quelle succession d'au moins 3 voyelles minuscules, tandis - que - \d{8} - n'accepte que 8 chiffres exactements. Une accolade ouvrante qui apparaît à une - position oú un quantificateur n'est pas accepté, ou si la syntaxe des - quantificateurs n'est pas respectée, elle sera considérée littérale. Par exemple, - {,6} n'est pas un quantificateur, mais une chaîne de 4 caractères. - Le quantificateur {0} est autorisé, mais l'expression est alors ignorée. -* équivalent à {0,} -+ équivalent à {1,} -? équivalent à {0,1} + que <literal>\d{d}</literal> n'accepte que 8 chiffres exactement. + </para> + <para> + Une accolade ouvrante qui apparaît à une position oú + un quantificateur n'est pas accepté, ou si la syntaxe des + quantificateurs n'est pas respectée, sera considérée + litérale. Par exemple, "<literal>{,6}</literal>" n'est pas un + quantificateur, mais une chaîne de 4 caractères. + </para> + <para> + Le quantificateur {0} est autorisé, mais l'expression est alors + ignorée. + <variablelist> + <varlistentry> + <term><emphasis>*</emphasis></term> + <listitem> + <simpara> + équivalent à {0,} + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>+</emphasis></term> + <listitem> + <simpara> + équivalent à {1,} + </simpara> + </listitem> + </varlistentry> + <varlistentry> + <term><emphasis>?</emphasis></term> + <listitem> + <simpara> + équivalent à {0,1} + </simpara> + </listitem> + </varlistentry> + </variablelist> + </para> + <para> Il est possible de constituer des boucles infinies en créant un sous-masque - sans caractères, mais pourvu d'un quantificateur sans limite supérieure. - Par exemple - (a?)* - Les versions plus anciennes de Perl et PCRE généraient alors une erreur - au moment de la compilation. Cependant, étant donné qu'il existe des situations - oú ces constructions peuvent être utiles, ces masques sont désormais autorisés. - Cependant, si la répétion du sous-masque ne trouve aucun caractère, la boucle est - interrompue. - Par défaut, les quantificateurs sont "gourmands", c'est à dire, qu'ils cherchent - d'abord à trouve le nombre maximal de répétitions qui autorise le succès de la - recherche. L'exemple classique posé par cette gourmandise est la recherche de - commentaire d'un programme en C. Les commentaires apparaissent entre les - séquences /* et */ et à l'intérieur de ces délimiteurs, les * et / sont autorisés. - Appliquer le masque - /\*.*\*/ + sans caractères, mais pourvu d'un quantificateur sans limite + supérieure. Par exemple "<literal>(a?)*</literal>. + </para> + <para> + Les versions plus anciennes de Perl et PCRE généraient alors + une erreur au moment de la compilation. Cependant, étant donné + qu'il existe des situations oú ces constructions peuvent être + utiles, ces masques sont désormais autorisés. Cependant, si + la répétion du sous-masque ne trouve aucun caractère, + la boucle est interrompue. + </para> + <para> + Par défaut, les quantificateurs sont dits "gourmands", c'est à + dire, qu'ils cherchent d'abord à trouve le nombre maximal de + répétitions qui autorise le succès de la recherche. + L'exemple classique posé par cette gourmandise est la recherche de + commentaires d'un programme en C. Les commentaires apparaissent entre les + séquences <literal>/*....*/</literal> et à l'intérieur + de ces délimiteurs, les <literal>*</literal> et <literal>/</literal> + sont autorisés. Appliquer le masque <literal>/\*.*\*/</literal> à la chaîne - /* first commet */ not comment /* second comment */ - ne peut réussir, car le masque travaille sur toute la chaîne, à cause de la - gourmandise du caractère .*. - Cependant, un quantificateur suivi d'un point d'interrogation cesse d'être - gourmand, et au contraire, ne recherche que le nombre minimum de répétition. - Dans ces conditions, le masque - /\*.*?\*/ - trouvera bien les commentaires du code C. La signification des autres - quantificateurs n'est pas changée. Attention à ne pas confondre l'utilisation du - point d'interrogation ici avec son utilisation comme quantificateur lui même. A - cause cette ambiguité, il peut apparaître des situations oú il faut le doubler : - \d??\d - Ce masque va tenter de lire un seul chiffre, mais le cas échéant, il acceptera 2 - chiffres pour permettre à la recherche d'aboutir. - Si l'option PCRE_UNGREEDY est mise, (une option qui n'est pas disponible avec - Perl) alors les quantificateurs sont non gourmand par défaut, mais peuvent être - rendu gourmand au cas par cas, en ajoutant un point d'interrogation après. En - d'autres termes, cette option inverse le comportement par défaut. - Lorsqu'un sous-masque est quantifié avec un nombre minimum de répétition, qui - soit plus grand que 1, ou avec un maximum de répétition, le masque compilé aura - besoin de plus de place de stockage, proportionnellement au minimum et au - maximum. - Si un masque commence par..* ou .{0,} et que l'option PCRE_DOTALL (équivalent - en Perl à /s) est mise, c'est à dire en autorisant le remplacement des nouvelles - lignes par un méta caractère, alors le masque est implicitement ancré, car tout - ce qui suit va être mangé par la première séquence, et se comportera comme si le - masque se terminait par le méta caractère \A. Dans le cas oú on sait d'avance qu'il - n'y aura pas de caractère de nouvelle ligne, mettre l'option PCRE_DOTALL et commencer - le masque par.* permet d'optmiser le masque. Alternativement, on peut utiliser - ^ pour ancrer explicitement le masque. - Lorsqu'un sous-masque capturant est répété, la valeur capturée est la dernière. - Par exemple, après que - (inter[net]{3}\s*)+ -*)+ - ai été appliqué à "internet interne" la valeur de la chaîne capturée est - "interne". Cependant, si il y a des sous-masques imbriqués, la valeur capturée - correspondante peut l'avoir été lors des précédentes itérations. Par exemple : - /(a|(b))+/ - accepte "aba" et la deuxième valeur capturée est -Références arrières (back references) - En dehors des classes de caractères, un antislash suivi d'un nombre plus grand - que 0 (et possiblement plusieurs chiffres) est une référence arrière (c'est à - dire vers la gauche) dans le masque, en supposant qu'il y ait suffisamment de - sous-masques capturant précédent. - Cependant, si le nombre décimal suivant l'antislash est plus petit - que 10, il sera toujours considéré comme une référence arrière, et cela générera une erreur - si le nombre de capture n'est pas suffisant. En d'autres termes, il faut qu'il existe - suffisamment de parenthèses ouvrantes à gauche de la référence, surtout si la - référence est inférieure à 10. Reportez vous à la section "antislash" pour avoir - de plus amples détails à propos du nombre de chiffres qui suivent l'antislash. - La référence arrière remplace ce qui a été capturé par un sous-masque dans le - masque courant, plutôt que remplace le sous-masque lui même. Ainsi - (calme|rapide) et \1ment - trouvera "calme et calmement " et "rapide et rapidement ", mais pas - " calme et rapidement ". Si la recherche tiens compte de la casse, alors la - casse de la chaîne capturée sera importante. Par exemple, - ((?i)rah)\s+\1 - trouve "rah rah" et "RAH RAH", mais pas "RAH rah", même si le sous-masque - capturant initial ne tenait pas compte de la casse. - Il peut y avoir plusieurs références arrières dans le même sous-masque. Si un - sous-masque n'a pas été utilisé dans une recherche, alors les références arrières - échoueront. Par exemple - (a|(bc))\2 - ne réussira jamais si la chaîne sujet commence par "a" plutôt que par "bc". - Etant donné qu'il peyt y avoir jusqu'à 99 références arrières, tous les chiffres - après l'antislash sont considérés comment faisant potentiellement partie de la - référence arrière. Si le masque recherche un chiffre après la référence, alors il - faut impérativement utiliser des délimiteurs pour terminer la référence arrière. Si - l'option PCRE_EXTENDED est mise, on peut utiliser un espace. Sinon, un - commentaire vide fait l'affaire. - Une référence arrière qui intervient à l'intérieur de parenthèses auquel - elle fait référence échouera dès que le sous-masque sera utilisé. Par exemple, - (a\1) échouera toujours. Cependant, ces références peuvent être utiles dans les + <literal>/* first commet */ not comment /* second comment */</literal> + ne peut réussir, car le masque travaille sur toute la chaîne, + à cause de la gourmandise du caractère <literal>.*</literal>. + </para> + <para> + Cependant, un quantificateur suivi d'un point d'interrogation cesse + d'être gourmand, et au contraire, ne recherche que le nombre + minimum de répétition. Dans ces conditions, le masque + <literal>/\*.*?\*/</literal> trouvera bien les commentaires du code + C. La signification des autres quantificateurs n'est pas changée. + </para> + <para> + Attention à ne pas confondre l'utilisation du point d'interrogation + ici avec son utilisation comme quantificateur lui même. + A cause cette ambiguité, il peut apparaître des situations + oú il faut le doubler : <literal>\d??\d</literal>. Ce masque va + tenter de lire un seul chiffre, mais le cas échéant, + il acceptera 2 chiffres pour permettre à la recherche + d'aboutir. Si l'option PCRE_UNGREEDY est activée, (une option qui + n'est pas disponible avec Perl) alors les quantificateurs sont + non gourmand par défaut, mais peuvent être + rendu gourmand au cas par cas, en ajoutant un point d'interrogation + après. En d'autres termes, cette option inverse le comportement par + défaut. + </para> + <para> + Lorsqu'un sous-masque est quantifié avec un nombre minimum + de répétitions, qui soit plus grand que 1, ou avec + un maximum de répétitions, le masque compilé aura + besoin de plus de place de stockage, proportionnellement au minimum + et au maximum. + </para> + <para> + Si un masque commence par <literal>..*</literal> ou <literal>.{0,}</literal> + et que l'option PCRE_DOTALL (équivalent en Perl à /s) est + activée, c'est à dire en autorisant le remplacement des nouvelles + lignes par un méta-caractère, alors le masque est + implicitement ancré, car tout ce qui suit va être + mangé par la première séquence, et se comportera + comme si le masque se terminait par le méta caractère + <literal>\A</literal>. Dans le cas oú on sait d'avance qu'il + n'y aura pas de caractère de nouvelle ligne, activer l'option + PCRE_DOTALL et commencer le masque par <literal>.*</literal> permet + d'optmiser le masque. + </para> + <para> + Alternativement, on peut utiliser <literal>^</literal> pour ancrer + explicitement le masque. Lorsqu'un sous-masque capturant est + répété, la valeur capturée est la + dernière. Par exemple, après que + "<literal>(inter[net]{3}\s*)+</literal>" ai été + appliqué à "<literal>internet interne</literal>", + la valeur de la chaîne capturée est "<literal>interne</literal>". + </para> + <para> + Cependant, s'il y a des sous-masques imbriqués, la valeur + capturée correspondante peut l'avoir été lors + des précédentes itérations. Par exemple : + <literal>/(a|(b))+/</literal> accepte "<literal>aba</literal>" et + la deuxième valeur capturée est "<literal>b</literal>". + </para> + </refsect2> + <refsect2 id="regexp.reference.back_references"> + <title>Références arrières </title> + <para> + En dehors des classes de caractères, un antislash suivi + d'un nombre plus grand que 0 (et possiblement plusieurs chiffres) + est une référence arrière (c'est à + dire vers la gauche) dans le masque, en supposant qu'il y ait + suffisamment de sous-masques capturants précédants. + </para> + <para> + Cependant, si le nombre décimal suivant l'antislash est + plus petit que 10, il sera toujours considéré + comme une référence arrière, et cela + générera une erreur si le nombre de capture + n'est pas suffisant. En d'autres termes, il faut qu'il existe + suffisamment de parenthèses ouvrantes à gauche + de la référence, surtout si la référence + est inférieure à 10. + </para> + <para> + Reportez vous à la section "antislash" pour avoir de + plus amples détails à propos du nombre de + chiffres qui suivent l'antislash. + </para> + <para> + La référence arrière remplace ce qui a + été capturé par un sous-masque dans le + masque courant, plutôt que remplace le sous-masque + lui-même. Ainsi <literal>(calme|rapide)</literal> et + <literal>\1ment</literal> trouvera "<literal>calme et calmement</literal>" + et "<literal>rapide et rapidement</literal>", mais pas + "<literal>calme et rapidement</literal>". Si la recherche tient + compte de la casse, alors la casse de la chaîne + capturée sera importante. Par exemple, + <literal>((?i)rah)\s+\1</literal> trouve "<literal>rah rah</literal>" + et "<literal>RAH RAH</literal>", mais pas "<literal>RAH rah</literal>", + même si le sous-masque capturant initial ne tenait pas compte + de la casse. + </para> + <para> + Il peut y avoir plusieurs références arrières dans + le même sous-masque. Si un sous-masque n'a pas été + utilisé dans une recherche, alors les références + arrières échoueront. Par exemple "<literal>(a|(bc))\2</literal>" + ne réussira jamais si la chaîne sujet commence par + "<literal>a</literal>" plutôt que par "<literal>bc</literal>". + </para> + <para> + Etant donné qu'il peyt y avoir jusqu'à 99 +références + arrières, tous les chiffres après l'antislash sont + considérés comment faisant potentiellement partie de + la référence arrière. Si le masque recherche un + chiffre après la référence, alors il faut + impérativement utiliser des délimiteurs pour terminer + la référence arrière. + </para> + <para>> + Si l'option PCRE_EXTENDED est activée, on peut utiliser un espace. + Sinon, un commentaire vide fait l'affaire. Une référence + arrière qui intervient à l'intérieur de + parenthèses auquel elle fait référence + échouera dès que le sous-masque sera utilisé. Par exemple, + <literal>(a\1)</literal> échouera toujours. Cependant, ces + références peuvent être utiles dans les sous-masques répétitifs. Par exemple, le masque - (a|b\1)+ - pourra convenir pour "a", "aba", "ababaa" etc. A chaque itération du sous-masque, - la référence arrière utilise le résultat du dernier sous-masque. Pour que cela - fonctionne, il faut que la première itération n'ai pas besoin d'utiliser la - référence arrière. Cela arrive avec les alternatives, comme dans l'exemple ci - dessus, ou avec un quantificateur de minimum 0. -Les assertions - Une assertion est un test sur les caractères suivants ou précédent celui qui est - en cours d'étude. Ce test ne consomme par de caractère (ie, on ne déplace pas le - pointeur de caractères). Les assertions simples sont codées avec \b, \B, \A, \Z, - \z, ^ et $, et sont décrite précédemment. Il existe cependant un type - d'assertion plus complexe, codées sous la forme de sous-masques. Il en existe - deux types : ceux qui travaille au dela de la position courante, et ceux qui - travaille en deça. - \w+(?=;) - Une assertion se comporte comme un sous-masque, hormis le fait qu'elle ne - déplace pas le pointeur de position. Les assertions avant commencent par (?= pour - les assertions positives et par (?! pour des assertions négatives. Par exemple : - foo(?!bar) - s'assure qu'un mot est suivi d'un point virgule, mais n'inclus pas le point - virgule dans la capture. D'autre part, - (?!foo)bar - en est proche, mais ne trouve pas une occurrence de "bar" qui soit précédée par - quelque chose d'autre que "foo"; il trouve toutes les occurrences de "bar", - quelque soit ce qui le précéde, car l'assertion (?!foo) est toujours vraie - quand les trois caractères suivants sont "bar". Une assertion arrière est ici nécessaire. - Ces assertions commencent par (?<= pour les assertions positives, et (?<! - pour les assertions négatives. Par exemple : - (?<!foo)bar - trouve les occurrences de "bar" qui ne sont pas précédées par "foo". Le contenu - d'une référence arrière est limité de tel façon que les chaînes qu'il utilise - sont toujours de la même taille. Cependant, lorsqu'il y a plusieurs alternatives, - elles n'ont pas besoin d'être de la même taille. - (?<=bullock|donkey) - est autorisé, tandis que - (?<!dogs?|cats?) - provoque une erreur de compilation. Les alternatives qui ont des longueurs - différentes ne sont autorisées qu'au niveau supérieur des assertions arrières. C'est - une amélioration du fonctionnement de Perl 5.005, qui impose aux alternatives - d'avoir toutes la même taille. Une assertion telle que - (?<=ab(c|de)) - n'est pas autorisée, car l'assertion de bas niveau (la deuxième, ici) a deux - alternatives de longueurs différentes. Pour la rendre acceptable, il faut écrire - (?<=abc|abde) - L' implémentation des assertions arrières déplace temporairement le pointeur - de position vers l'arrière, et cherche à vérifier l'assertion. Si le nombre de - caractère est différent, la position ne sera pas correcte, et l'assertion - échouera. La combinaison d'assertions arrières avec des sous-masques peut être - particulièrement pratique à fin des chaînes. Un exemple est donné à la fin de - cette section. - Plusieurs assertions peuvent intervenir successivement. Par exemple - (?<=\d{3})(?<!999)foo - recherche les chaînes "foo" précédée par trois chiffres qui ne sont pas "999". - Notez que chaque assertions est appliquées indépendemment, au même point - de la chaîne à traiter. Tout d'abord, il est vérifié que les trois premiers - caractères ont tous des chiffres, puis on s'assure que ces trois caractères - ne sont pas "999". Le masque précédant n'accepte pas "foo" précédé de 6 - caractères, les trois premiers étant des chiffres et les trois suivant - étant différents de "999". Par exemple, ce masque n'acceptera pas la chaîne - "123abcfoo". Pour ce faire, il faut utiliser : - (?<=\d{3}...)(?<!999)foo - Dans ce masque, la première assertion vérifie les six premiers caractères, - s'assure que les trois premiers sont des entiers, et la deuxième assertion - s'assure que les trois derniers caractères ne sont pas "999". - De plus, les assertions peuvent être imbriquées : - (?<=(?<!foo)bar)baz - recherche les occurrences de "baz" qui sont précédées par "bar", qui, à son tour, - n'est pas précédé par "foo". Au contraire, - (?<=\d{3}(?!999)...)foo - est un autre masque, qui recherche les caractères "foo", précédés par - trois chiffres, suivis trois autres caractères qui ne forment pas "999". - Les assertions ne sont pas capturantes, et ne peuvent pas être répétées. Si une - assertion contient des sous-masques capturants en son sein, ils seront compris - dans le nombre de sous-masques capturants du masque entier. La capture est - réalisée pour les assertions positives, mais cela n'a pas de sens pour les - assertions négatives. - 200 assertions au maximum sont autorisées. - sous-masques uniques (ONCE-ONLY SUBPATTERNS) - Avec les quantificateurs de répétitions, l'échec d'une recherche conduit - normalement à une autre recherche, avec un nombre différent de répétitions, pour - voir si le masque ne s'applique pas dans d'autres conditions. Parfois, il - est pratique d'éviter ce comportement, soit pour changer la nature de la recherche, - soit pour la faire abandonner plus tôt, si on pense qu'il n'est pas besoin - d'aller plus loin. - Considérons par exemple, le masque \d+foo appliqué à la ligne -123456bar - Après avoir tenté d'utiliser les 6 chiffres suivi de "foo" qui - fait échouer, l'action habituelle sera de réessayer avec 5 - chiffres, puis avec 4, et ainsi de suite jusqu'à l'échec final. - Un sous-masque évalué une seule fois permettrait d'indiquer que - lorsqu'une partie du masque est trouvée, elle n'a pas besoin - d'être réévaluée à chaque tentative. Ceci - conduirait à ce que la recherche échoue immédiatement - après le premier test. Ces assertions ont leur propre notation, - commencant avec (?>comme ceci : -(?>\d+)bar - Après avoir tenté d'utiliser les 6 chiffres suivi de "foo" - qui fait échouer, l'action habituelle sera de réessayer avec - 5 chiffres, puis avec 4, et ainsi de suite jusqu'à l'échec - final. Un sous-masque évalué une seule fois permettrait + "<literal>(a|b\1)+</literal>" pourra convenir pour "<literal>a</literal>", + "<literal>aba</literal>", "<literal>ababaa</literal>", etc.... + </para> + <para> + A chaque itération du sous-masque, la référence + arrière utilise le résultat du dernier sous-masque. + Pour que cela fonctionne, il faut que la première + itération n'ai pas besoin d'utiliser la référence + arrière. Cela arrive avec les alternatives, comme dans + l'exemple ci dessus, ou avec un quantificateur de minimum 0. + </para> + </refsect2> + <refsect2 id="regexp.reference.assertions"> + <title>Assertions</title> + <para> + Une assertion est un test sur les caractères suivants ou + précédent celui qui est en cours d'étude. Ce + test ne consomme par de caractère (ie, on ne déplace + pas le pointeur de caractères). Les assertions simples sont + codées avec <literal>\b</literal>, <literal>\B</literal>, + <literal>\A</literal>, <literal>\Z</literal>, <literal>\z</literal>, + <literal>^</literal> et <literal>$</literal>, et sont décrites + précédemment. + </para> + <para> + Il existe cependant un type d'assertions plus complexes, codées + sous la forme de sous-masques. Il en existe deux types : celles qui + travaillent au-dela de la position courante (<literal>\w+(?=;)</literal>), + et celles qui travaillent en deça (<literal>(?!)\w+</literal>). + </para> + <para> + Une assertion se comporte comme un sous-masque, hormis le fait qu'elle + ne déplace pas le pointeur de position. Les assertions avant + commencent par <literal>(?=</literal> pour les assertions positives, et + par <literal>(?!</literal>, pour les assertions négatives. Par exemple : + <literal>\w+(?=;)</literal> s'assure qu'un mot est suivi d'un point-virgule, + mais n'inclus pas le point virgule dans la capture. D'autre part, + <literal>(?!foo)bar</literal> en est proche, mais ne trouve pas une + occurrence de "<literal>bar</literal>" qui soit précédée + par quelque chose d'autre que "<literal>foo</literal>foo"; il trouve toutes + les occurrences de "<literal>bar</literal>", quelque soit ce qui + le précéde, car l'assertion <literal>(?!foo)</literal> + est toujours vraie quand les trois caractères suivants sont + "<literal>bar</literal>". Une assertion arrière est ici + nécessaire. + </para> + <para> + Les assertions arrières commencent par <literal>(?<=</literal> + pour les assertions positives, et <literal>(?<!</literal> pour les + assertions négatives. Par exemple : <literal>(?<!foo)bar</literal> + trouve les occurrences de "<literal>bar</literal>" qui ne sont pas + précédées par "<literal>foo</literal>". + </para> + <para> + Le contenu d'une référence arrière est limité + de telle façon que les chaînes qu'il utilise + soient toujours de la même taille. Cependant, lorsqu'il + y a plusieurs alternatives, elles n'ont pas besoin d'être + de la même taille. Par exemple, +<literal>(?<=bullock|donkey)</literal> + est autorisé, tandis que <literal>(?<!dogs?|cats?)</literal> + provoque une erreur de compilation. Les alternatives qui ont des + longueurs différentes ne sont autorisées qu'au niveau + supérieur des assertions arrières. C'est une + amélioration du fonctionnement de Perl 5.005, qui impose + aux alternatives d'avoir toutes la même taille. Une + assertion telle que <literal>(?<=ab(c|de))</literal> n'est pas + autorisée, car l'assertion de bas niveau (la deuxième, + ici) a deux alternatives de longueurs différentes. Pour + la rendre acceptable, il faut écrire +<literal>(?<=abc|abde)</literal> + </para> + <para> + L'implémentation des assertions arrières déplace + temporairement le pointeur de position vers l'arrière, et cherche + à vérifier l'assertion. Si le nombre de caractères + est différent, la position ne sera pas correcte, et l'assertion + échouera. La combinaison d'assertions arrières avec des + sous-masques peut être particulièrement pratique à + fin des chaînes. Un exemple est donné à la fin de + cette section. + </para> + <para> + Plusieurs assertions peuvent intervenir successivement. Par exemple, + le masque <literal>(?<=\d{3})(?<!999)foo</literal> recherche + les chaînes "<literal>foo</literal>" précédées + par trois chiffres qui ne sont pas "999". Notez que chaque assertion + est appliquées indépendemment, au même point de + la chaîne à traiter. Tout d'abord, il est + vérifié que les trois premiers caractères ont + tous des chiffres, puis on s'assure que ces trois caractères + ne sont pas "<literal>999</literal>". Le masque précédant + n'accepte pas "<literal>foo</literal>" précédé de + 6 caractères, les trois premiers étant des chiffres et + les trois suivants étant différents de +"<literal>999</literal>". + Par exemple, ce masque n'acceptera pas la chaîne + "<literal>123abcfoo</literal>". Pour ce faire, il faut utiliser le masque + suivant : <literal>(?<=\d{3}...)(?<!999)foo</literal>. Dans ce + masque, la première assertion vérifie les six premiers + caractères, s'assure que les trois premiers sont des entiers, + et la deuxième assertion s'assure que les trois derniers + caractères ne sont pas "<literal>999</literal>". + </para> + <para> + De plus, les assertions peuvent être imbriquées : + <literal>(?<=(?<!foo)bar)baz</literal> recherche les + occurrences de "<literal>baz</literal>" qui sont + précédées par "<literal>bar</literal>", qui, + à son tour, n'est pas précédé par + "<literal>foo</literal>". Au contraire, + <literal>(?<=\d{3}(?!999)...)foo</literal> est un autre masque, + qui recherche les caractères "<literal>foo</literal>", + précédés par trois chiffres, suivis trois + autres caractères qui ne forment pas "<literal>999</literal>". + Les assertions ne sont pas capturantes, et ne peuvent pas être + répétées. Si une assertion contient des sous-masques + capturants en son sein, ils seront compris dans le nombre de sous-masques + capturants du masque entier. La capture est réalisée pour + les assertions positives, mais cela n'a pas de sens pour les + assertions négatives. + </para> + <para> + 200 assertions au maximum sont autorisées. + </para> + </refsect2> + <refsect2 id="regexp.reference.onlyonce"> + <title>Sous-masques uniques</title> + <para> + Avec les quantificateurs de répétitions, l'échec + d'une recherche conduit normalement à une autre recherche, avec + un nombre différent de répétitions, pour + voir si le masque ne s'applique pas dans d'autres conditions. + Parfois, il est pratique d'éviter ce comportement, soit + pour changer la nature de la recherche, soit pour la faire abandonner + plus tôt, si on pense qu'il n'est pas besoin d'aller plus loin. + </para> + <para> + Considérons par exemple, le masque <literal>\d+foo</literal> + appliqué à la ligne <literal>123456bar</literal>. + Après avoir tenté d'utiliser les 6 chiffres suivi + de "<literal>foo</literal>" qui font échouer, l'action habituelle + sera de réessayer avec 5 chiffres, puis avec 4, et ainsi de + suite jusqu'à l'échec final. + </para> + <para> + Un sous-masque évalué une seule fois permettrait d'indiquer que lorsqu'une partie du masque est trouvée, elle n'a pas besoin d'être réévaluée à - chaque tentative. Ceci conduirait à ce que la recherche échoue - immédiatement après le premier test. Ces assertions ont leur - propre notation, commencant avec (?> comme ceci : (?>\d+)bar. + chaque tentative. Ceci conduirait à ce que la recherche + échoue immédiatement après le premier test. + Ces assertions ont leur propre notation, commencant avec + <literal>(?></literal> comme ceci : <literal>(?>\d+)bar</literal>. + </para> + <para> Ce type de parenthèses verrouille le sous-masque qu'il contient un fois qu'il a été trouvé, et empêche un - échec ultérieur d'y repasser, mais autorise à revenir - plus loin en arrière. Une autre description est que les sous-masques - de ce type recherche les chaînes - de caractères, et les ancre le sous-masque à l'intérieur de la chaîne. - Les sous-masques uniques ne sont pas capturants. Des cas simples comme ceux - présentés ci dessus peuvent être pris comme des situations maximisantes, qui - réservent le maximum de caractères. En effet, alors que \d+ et \d+? ajustent - le nombre de chiffres trouvés de manière à laisser la possibilité au masque de - réussir, (?>\d+) ne peut retenir que la séquence entière de chiffres. - Cette construction peut contenir un nombre arbitraire de sous-masques complexes, - et ils peuvent être imbriqués. - Les sous-masques uniques ne peuvent être utilisés qu'avec les assertions - arrières, pour effectuer une recherche efficace en fin de chaîne. Considérons - un masque simple tel que - abcd$ - appliqué à une très longue chaîne qui ne lui correspond pas. A cause du système - de recherche de gauche à droite, PCRE va commencer par rechercher un "a" dans - la chaîne sujet, puis vérifier si ce qui suit convient au reste du masque. Si - le masque est spécifié sous la forme - ^.*abcd$ - alors, la séquence.* remplace en premier lieu la chaîne entière, et échoue, - repart en arrière, et remplace tous les caractères sauf le dernier, échoue, - retourne en arrière, prend un caractère de moins, etc... et ainsi de suite. - Encore une fois, la recherche du "a" passe en revue toute la chaîne de gauche - à droite, ce qui n'est pas très efficace. Par contre, si le masque était écrit - ^(?>.*)(?<=abcd) - alors il n'y aurait pas de retour en arrière, pour satisfaire la séquence.*; - car elle ne peut que remplacer toute la chaîne. L'assertion arrière consécutive - va alors faire un test sur les 4 derniers caractères. Si elle échoue, la - recherche est immédiatement interrompue. Pour les chaînes très longues, cette - approche fait la différence en terme de performance et de temps de recherche. - Lorsqu'un masque contient une répétition illimitée dans un sous-masque, - qui contient lui-même un nombre illimité de répétiteur, l'utilisation des - sous-masques à utilisation unique sont la seule façon d'éviter l'échec - de la recherche à cause d'un temps de calcul trop long. - Le masque - (\D+|<\d+>)*[!?] - recherche un nombre illimité de sous-chaînes, qui contiennent - soit des non-chiffres, ou alors des chiffres inclus dans - <>, suivi soit par ! ou par ?. Lorsqu'il trouve une solution, - ce masque va très vite. Mais, lorsqu'il est appliqué à une chaîne - telle que : - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - Il lui faut beaucoup de temps pour annoncer un échec. Cela est - du au fait que la chaine peut être divisée en deux sous-chaînes - d'un grand nombre de façons, et qu'elles ont toutes été essayées. - (Cet exemple utilisait [!?] plutot qu'un caractère simple, car - PCRE et PHP utilise une optimisation qui permet de detecter rapidement - l'échec lorsqu'un caractère unique est trouvé. Il se souvient - du dernier caractère qui est attendu, et s'apercoit rapidement - qu'il n'y a pas ce caractère.). Si le masque utilisé est - ((?>\D+)|&;lt;\d+>)*[!?] - les séquences de chiffres ne peuvent pas être trouvées, et l'échec - intervient rapidement. -Les sous-masques conditionnels (CONDITIONAL SUBPATTERNS) - Il est possible de lier un sous-masque à un une condition, ou de choisir entre - deux sous-masques alternatifs, en fonction du résultat d'une assertion, ou - suivant les résultats de recherche précédents. Les deux formes possibles de sous - masques conditionnels sont -(?(condition)masque positif) -(?(condition) masque positif | masque négatif) - Si les conditions sont satisfaites, le masque positif est utilisé, sinon, le - masque négatif est utilisé, si présent. Si il y a plus de deux alternatives, une - erreur est générée à la compilation. - Il y a deux types de conditions. Si le texte entre les parenthèses est une - séquence de chiffre, alors la condition est satisfaite si le sous-masque - correspondant à ce numéro a réussi. Considérons le masque suivant, qui contient - des espaces non significatif pour le rendre plus compréhensible (on supposera - l'option PCRE_EXTENDED mise) et qui est divisé en trois parties pour simplifier - les explications - ( \( )? [^()]+ (?(1) \) ) - La première partie recherche une parenthèse ouvrante optionnelle, et si elle - existe, elle est capturée. La deuxième partie recherche un séquence de caractères - qui ne contient pas de parenthèses. La troisième partie est conditionnée à la - première, et s'assure que si il y avait une parenthèse ouvrante, il en existe une - fermante. Si une parenthèse ouvrante a été trouvée, elle a été capturée, et donc - la première capture existe, et la condition est exécutée. Sinon, elle est ignorée. - Ce masque recherche donc une séquence de lettre, éventuellement mis entre parenthèse. - Si la condition n'est pas une séquence de nombre, il faut que ce soit une - assertion. Ce peut être une assertion positive ou négative, arrière ou avant. - Considérons le masque suivant (même conditions que le précédent) et avec deux + échec ultérieur d'y repasser, mais autorise à + revenir plus loin en arrière. Une autre description est que + les sous-masques de ce type recherche les chaînes de + caractères, et les ancre le sous-masque à l'intérieur + de la chaîne. + </para> + <para> + Les sous-masques uniques ne sont pas capturants. Des cas simples comme + ceux présentés ci-dessus peuvent être pris comme + des situations maximisantes, qui réservent le maximum de + caractères. En effet, alors que <literal>\d+</literal> et + <literal>\d+?</literal> ajustent le nombre de chiffres trouvés + de manière à laisser la possibilité au masque de + réussir, <literal>(?>\d+)</literal> ne peut retenir que la + séquence entière de chiffres. Cette construction peut + contenir un nombre arbitraire de sous-masques complexes, et ils peuvent + être imbriqués. + </para> + <para> + Les sous-masques uniques ne peuvent être utilisés qu'avec + les assertions arrières, pour effectuer une recherche efficace + en fin de chaîne. Considérons un masque simple tel que + "<literal>abcd$</literal>" appliqué à une très + longue chaîne qui ne lui correspond pas. A cause du système + de recherche de gauche à droite, PCRE va commencer par rechercher + un "<literal>a</literal>" dans la chaîne sujet, puis vérifier + si ce qui suit convient au reste du masque. Si le masque est + spécifié sous la forme <literal>^.*abcd$</literal> + alors, la séquence <literal>.*</literal> remplace en premier + lieu la chaîne entière, et échoue, repart en + arrière, et remplace tous les caractères sauf le dernier, + échoue, retourne en arrière, prend un caractère + de moins, etc... et ainsi de suite. Encore une fois, la recherche du + "<literal>a</literal>" passe en revue toute la chaîne de gauche + à droite, ce qui n'est pas très efficace. Par contre, + si le masque était écrit +<literal>^(?>.*)(?<=abcd)</literal> + alors il n'y aurait pas de retour en arrière, pour satisfaire + la séquence <literal>.*</literal>, car elle ne peut que remplacer + toute la chaîne. L'assertion arrière consécutive + va alors faire un test sur les 4 derniers caractères. Si elle + échoue, la recherche est immédiatement interrompue. + </para> + <para> + Pour les chaînes très longues, cette approche fait la + différence en terme de performances et de temps de recherche. + Lorsqu'un masque contient une répétition illimitée + dans un sous-masque, qui contient lui-même un nombre + illimité de répétiteur, l'utilisation des + sous-masques à utilisation unique sont la seule façon + d'éviter l'échec de la recherche à après un + temps de calcul trop long. + </para> + <para> + Le masque <literal>(\D+|<\d+>)*[!?]</literal> recherche un nombre + illimité de sous-chaînes, qui contiennent soit + des non-chiffres, soit des chiffres inclus dans <>, suivi soit + par <literal>!</literal> ou par <literal>?</literal>. Lorsqu'il trouve + une solution, ce masque va très vite. Mais, lorsqu'il est + appliqué à une chaîne telle que : + <literal>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</literal>, + il lui faut beaucoup de temps pour annoncer un échec. Cela est + dû au fait que la chaine peut être divisée en deux + sous-chaînes d'un grand nombre de façons, et qu'elles + ont toutes été essayées. (Cet exemple utilisait + <literal>[!?]</literal> plutôt qu'un caractère simple, car + PCRE et PHP utilise une optimisation qui leur permettent de détecter + rapidement l'échec lorsqu'un caractère unique est + trouvé. Il se souvient du dernier caractère qui est + attendu, et s'aperçoit rapidement qu'il n'y a pas ce +caractère). + </para> + <para> + Si le masque utilisé est +<literal>((?>\D+)|&;lt;\d+>)*[!?]</literal> + les séquences de chiffres ne peuvent pas être + trouvées, et l'échec intervient rapidement. + </para> + </refsect2> + <refsect2 id="regexp.reference.conditional"> + <title>Les sous-masques conditionnels</title> + <para> + Il est possible de lier un sous-masque à une condition, ou de + choisir entre deux sous-masques alternatifs, en fonction du + résultat d'une assertion, ou suivant les résultats + de recherche précédents. + </para> + <para> + Les deux formes possibles de sous-masques conditionnels sont + <literal>(?(condition)masque positif)</literal> et + <literal>(?(condition) masque positif | masque négatif)</literal>. + </para> + <para> + Si les conditions sont satisfaites, le masque positif est utilisé, + sinon, le masque négatif est utilisé, si présent. + S'il y a plus de deux alternatives, une erreur est générée + à la compilation. + </para> + <para> + Il y a deux types de conditions : si le texte entre les parenthèses + est une séquence de chiffres, alors la condition est satisfaite si + le sous-masque correspondant à ce numéro a réussi. + Considérons le masque suivant, qui contient des espaces non + significatifs pour le rendre plus compréhensible (on supposera + l'option PCRE_EXTENDED activée) et qui est divisé en trois +parties + pour simplifier les explications : <literal>( \( )? [^()]+ (?(1) \) +)</literal>. + </para> + <para> + La première partie recherche une parenthèse ouvrante + optionnelle, et si elle existe, elle est capturée. La deuxième + partie recherche un séquence de caractères qui ne contiennent + pas de parenthèses. La troisième partie est + conditionnée à la première, et s'assure que si il + y avait une parenthèse ouvrante, il en existe une fermante. + Si une parenthèse ouvrante a été trouvée, + elle a été capturée, et donc la première capture + existe, et la condition est exécutée. Sinon, elle est + ignorée. + </para> + <para> + Ce masque recherche donc une séquence de lettres, éventuellement + placées entre parenthèse. Si la condition n'est pas une + séquence de chiffres, il faut que ce soit une assertion. + Ce peut être une assertion positive ou négative, + arrière ou avant. Considérons le masque suivant + (même conditions que le précédent) et avec deux alternatives en seconde ligne : -(?(?=[^a-z]*[a-z]) -\d{2}[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) - La condition est une assertion avant positive, qui recherche une séquence optionnelle - de caractère non-lettre. En d'autres termes, elle teste la presence d'au moins - une lettre dans la chaîne sujet. Si une lettre est trouvée, la recherche se - poursuit avec la première alternative, et sinon, avec la seconde. Ce masque - recherche des chaînes de la forme dd-aaa-dd ou dd-dd-dd, avec aaa qui sont des - lettres, et dd qui sont des chiffres -COMMENTS - La séquence (?# marque le début des commentaires, qui se termine à la - prochaîne parenthèse fermante. Les parenthèses imbriquées ne sont pas autorisées. - Les caractères entre ces délimiteurs ne jouent alors aucun rôle + <literal>(?(?=[^a-z]*[a-z])\d{2}[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} )</literal>. + La condition est une assertion avant positive, qui recherche une + séquence optionnelle de caractères non-lettre. En d'autres + termes, elle teste la presence d'au moins une lettre dans la chaîne + sujet. Si une lettre est trouvée, la recherche se poursuit avec + la première alternative, et sinon, avec la seconde. Ce masque + recherche des chaînes de la forme <literal>dd-aaa-dd</literal> ou + <literal>dd-dd-dd</literal>, avec "<literal>aaa</literal>" qui sont des + lettres, et <literal>dd</literal> qui sont des chiffres. + </para> + </refsect2> + <refsect2 id="regexp.reference.comments"> + <title>Commentaires</title> + <simpara> + La séquence <literal>(?#</literal> marque le début d'un +commentaire, + qui se termine à la prochaîne parenthèse fermante. Les + parenthèses imbriquées ne sont pas autorisées. Les + caractères entre ces délimiteurs ne jouent alors aucun rôle dans le masque. - Si l'option PCRE_EXTENDED est mise, les caractères dièses # non échappés en - dehors d'une classe de caractères introduisent un commentaire qui continuera - jusqu'à la prochaîne ligne dans le masque. -Masques récursifs - Considérons le cas où il faut recherche dans une chaîne, avec un - niveau d'imbrication infini de parenthèses. Sans l'aide de la récursivité, le - mieux que nous puissions obtenir est de créer un masque avec un - niveau fixé de profondeur d'imbrication. Il n'est pas possible - de traiter des masques à niveau d'imbrications variable. PCRE fournit - un nouvel outil expérimental qui permet d'utiliser la récursivité - dans les masques (entre autre). L'option (?R) est fournie pour servir - la cause de la récursivité. Le masque suivant résoud le problème des - parenthèses (en utilisant l'option PCRE_EXTENDED est utilisée pour - ignorer les espaces) : - \( ( (?>[^()]+) | (?R) )* \) - Tout d'abord, le masque recherche une parenthèse ouvrante. Puis, - il recherche n'importe quel nombre de sous-chaînes qui sont soit - des séquences de caractères non-parenthèses, ou bien une recherche - récursive avec le même masque (i.e. une chaîne correctement - inclus entre parenthèses). Finalement, il recherche une - parenthèse fermante. - Cet exemple particulier contient un nombre illimité de répétitions - imbriquées, ce qui fait que l'utilisation de sous-chaînes à - utilisation unique pour rechercher les séquence de caractères - non-parenthèses est important, lorsqu'il s'applique à une chaîne - qui n'est pas valide. Par exemple, si on l'applique à - (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() - la réponse arrive rapidement. Sinon, si les sous-chaînes à utilisation - unique ne sont pas utilisées, la recherche peut prendre un très long - temps, car il existe de très nombreuses combinaisons de - + et * à tester avant de conclure à l'échec. - Les valeurs utilisées pour capturer les sous-masques sont celles - utilisées par les niveaux les plus hauts de récursivités, auquel - la valeur est fixée. Si le masque précédent est utilisé avec - (ab(cd)ef) - la valeur de la parenthèse capturante est "ef", qui est la dernière - valeur lue au niveau supérieur. Si de nouvelles parenthèses sont - ajoutées, par exemple : - \( ( ( (?>[^()]+) | (?R) )* ) \) - ^ ^ - ^ ^ - alors la chaîne capturée est "ab(cd)ef", c'est à dire le contenu de la - parenthèses capturant de plus haut niveau. S'il y a plus de 15 parenthèses - capturantes dans une chaîne, PCRE doit utiliser plus de mémoire pour - stocker ces données. S'il ne peut obtenir cette mémoire supplémentaire, - il ne fait que sauver les 15 premières, car il n'y a pas moyen de générer - une erreur de mémoire lors d'une récursion. -PERFORMANCE - Certaines séquences de recherches sont plus efficaces que d'autres. Ainsi, il - est plus efficace d'utiliser une classe de caractères telle que [aeiou] plutôt - qu'une alternative (a|e|i|o|u). - En général, le masque le plus simple, qui permette la recherche désirée est - généralement le plus efficace. Le livre de Jeffrey Friedl's contient de - nombreuses études à propos de l'optimisation des expressions régulières. - Lorsqu'un masque commence par.* et que l'option PCRE_DOTALL est mise, le masque - est implicitement ancré par PCRE, étant donné qu'il ne peut que rechercher au - début de la chaîne. Cependant, si option PCRE_DOTALL n'est pas mise, PCRE ne - peut faire aucune optimisation ca le méta-caractères point (). ne remplace pas une - nouvelle ligne, et si la chaîne sujet contient des nouvelles lignes, le masque - peut trouver une solution qui serait située juste après une de ces nouvelles - lignes, et non pas seulement au début de la chaîne sujet. Par exemple, le masque, - (.*) second - acceptera la chaîne "premier \net second" (avec \n qui remplace la nouvelle ligne), - et la première chaîne capturée sera "et". Afin d'effectuer la recherche, PCRE - va essayer d'appliquer le masque à partir de chaque début de ligne. - Si vous utilisez un tel masque avec des chaînes qui ne contiennent pas de - caractères de nouvelles lignes, les meilleures performances seront atteintes - avec l'option PCRE_DOTALL, ou en ancrant le masque avec ^.*. Cela évite à PCRE - de scanner toute la chaîne pour rechercher un caractère de nouvelle ligne et - recommencer la recherche. - Attention aux masques qui contiennent des quantificateurs infinis - imbriqués. Ils peuvent demander un temps de calcul très long, lorsqu'appliqués - à une chaîne qui n'accepte pas ce masque. Par exemple, - (a+)* - peut accepter "aaaa" de 33 manières différentes, et ce nombre - croit rapidement avec la taille de la chaîne (le quantificateur - * peut prendre les valeurs de 0, 1, 2, 3, ou 4, et pour chaque cas - non nul, le quantificateur + peut prendre différentes valeurs). - Lorsque le reste de la chaîne est tel que l'on s'achemine vers un - échec, PCRE doit en principe vérifier toutes les possibilités, et cela - prend un temps extrêmement long. - Un optmiseur repère les cas les plus simples, tel que - (a+)*b - où un caractère simple suit les quantificateurs. Avant de partir - dans les procédures standard de recherche, PCRE s'assure qu'il y a - au moins un "b" dans la chaîne, et si ce n'est pas le cas, l'échec - est annoncé immédiatement. Sinon, il n'y a pas d'optimisation dans - la recherche. Vous pouvez voir la différence de comportement - avec le masque suivant : - (a+)*\d - Le premier retourne un échec quasi immédiatement, s'il est appliqué - à une ligne de "a", alors que le second masque prend un temps - significatif pour une chaîne de plus de 20 caractères. - </literallayout> + </simpara> + <simpara> + Si l'option PCRE_EXTENDED est activée, les caractères +dièses + <literal>#</literal> non échappés en dehors d'une classe de + caractères introduisent un commentaire qui continuera jusqu'à + la prochaîne ligne dans le masque. + </simpara> + </refsect2> + <refsect2 id="regexp.reference.recursive"> + <title>Masques récursifs</title> + <para> + Considérons le cas où il faut recherche dans une + chaîne, avec un niveau d'imbrications infini de + parenthèses. Sans l'aide de la récursivité, le + mieux que nous puissions obtenir est de créer un masque avec un + niveau fixé de profondeur d'imbrication. Il n'est pas possible + de traiter des masques à niveau d'imbrications variable. + PCRE fournit un nouvel outil expérimental qui permet + d'utiliser la récursivité dans les masques (entre autre). + L'option <literal>(?R)</literal> est fournie pour servir la cause de + la récursivité. Le masque suivant résoud le + problème des parenthèses (l'option PCRE_EXTENDED est + utilisée pour ignorer les espaces) : + <literal>\( ( (?>[^()]+) | (?R) )* \)</literal> + </para> + <para> + Tout d'abord, le masque recherche une parenthèse ouvrante. Puis, + il recherche n'importe quel nombre de sous-chaînes qui sont soit + des séquences de caractères non-parenthèses, ou + bien une recherche récursive avec le même masque (i.e. + une chaîne correctement incluse entre parenthèses). + Finalement, il recherche une parenthèse fermante. + </para> + <para> + Cet exemple particulier contient un nombre illimité de + répétitions imbriquées, ce qui fait que + l'utilisation de sous-chaînes à utilisation unique + pour rechercher les séquence de caractères + non-parenthèses est important, lorsqu'il s'applique à + une chaîne qui n'est pas valide. Par exemple, si on l'applique + à +"<literal>(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()</literal>" + la réponse arrive rapidement. Sinon, si les sous-chaînes + à utilisation unique ne sont pas utilisées, la + recherche peut prendre un très long temps, car il existe + de très nombreuses combinaisons de <literal>+</literal> et + <literal>*</literal> à tester avant de conclure à + l'échec. + </para> + <para> + Les valeurs utilisées pour capturer les sous-masques sont celles + utilisées par les niveaux les plus hauts de + récursivités, auquel la valeur est fixée. + Si le masque précédent est utilisé avec + <literal>(ab(cd)ef)</literal> la valeur de la parenthèse + capturante est "<literal>ef</literal>", qui est la dernière + valeur lue au niveau supérieur. Si de nouvelles + parenthèses sont ajoutées, par exemple : + <literal>\( ( ( (?>[^()]+) | (?R) )* ) \)</literal> + alors la chaîne capturée est "<literal>ab(cd)ef</literal>", + c'est à dire le contenu de la parenthèses capturant + de plus haut niveau. S'il y a plus de 15 parenthèses + capturantes dans une chaîne, PCRE doit utiliser plus + de mémoire pour stocker ces données. S'il ne + peut obtenir cette mémoire supplémentaire, il ne fait + que sauver les 15 premières, car il n'y a pas moyen de + générer une erreur de mémoire lors d'une + récursion. + </para> + </refsect2> + <refsect2 id="regexp.reference.performances"> + <title>Performances</title> + <para> + Certaines séquences de recherches sont plus efficaces que d'autres. + Ainsi, il est plus efficace d'utiliser une classe de caractères + telle que <literal>[aeiou]</literal> plutôt qu'une alternative + <literal>(a|e|i|o|u)</literal>. + </para> + <para> + En général, le masque le plus simple, qui permette + la recherche désirée est le plus efficace. Le livre + de Jeffrey Friedl's contient de nombreuses études à + propos de l'optimisation des expressions régulières. + </para> + <para> + Lorsqu'un masque commence par.* et que l'option PCRE_DOTALL est + activée, le masque est implicitement ancré par PCRE, + étant donné qu'il ne peut que rechercher au début + de la chaîne. Cependant, si option PCRE_DOTALL n'est pas + activée, PCRE ne peut faire aucune optimisation car le + méta-caractères point "<literal>.</literal>" + ne remplace pas une nouvelle ligne, et si la chaîne + sujet contient des nouvelles lignes, le masque peut trouver une + solution qui serait située juste après une + de ces nouvelles lignes, et non pas seulement au début + de la chaîne sujet. Par exemple, le masque, + <literal>(.*)second</literal> acceptera la chaîne + "<literal>premier \net second</literal>" (avec "<literal>\n</literal>" + qui remplace la nouvelle ligne), et la première chaîne + capturée sera "<literal>et</literal>". + </para> + <para> + Afin d'effectuer la recherche, PCRE va essayer d'appliquer le masque + à partir de chaque début de ligne. Si vous utilisez un + tel masque avec des chaînes qui ne contiennent pas de + caractères de nouvelles lignes, les meilleures performances + seront atteintes avec l'option PCRE_DOTALL, ou en ancrant le + masque avec <literal>^.*</literal>. Cela évite à PCRE + de scanner toute la chaîne pour rechercher un caractère + de nouvelle ligne et recommencer la recherche. + </para> + <para> + Attention aux masques qui contiennent des quantificateurs infinis + imbriqués. Ils peuvent demander un temps de calcul très + long, lorsqu'appliqués à une chaîne qui ne + correspond pas à ce masque. Par exemple, <literal>(a+)*</literal> + peut accepter "<literal>aaaa</literal>" de 33 manières + différentes, et ce nombre croit rapidement avec la taille + de la chaîne (le quantificateur <literal>*</literal> peut prendre + les valeurs de 0, 1, 2, 3, ou 4, et pour chaque cas non nul, le + quantificateur <literal>+</literal> peut prendre différentes + valeurs). + </para> + <para> + Lorsque le reste de la chaîne est tel que l'on s'achemine + vers un échec, PCRE doit en principe vérifier + toutes les possibilités, et cela prend un temps + extrêmement long. Un optmiseur repère les cas + les plus simples, tel que <literal>(a+)*b</literal> où + un caractère simple suit les quantificateurs. Avant de partir + dans les procédures standard de recherche, PCRE + s'assure qu'il y a au moins un "<literal>b</literal>" dans la + chaîne, et si ce n'est pas le cas, l'échec est + annoncé immédiatement. Sinon, il n'y a pas + d'optimisation dans la recherche. Vous pouvez voir la + différence de comportement avec le masque suivant : + <literal>(a+)*\d</literal>. Le premier retourne un échec + quasi-immédiatement, s'il est appliqué à + une ligne de "<literal>a</literal>", alors que le second masque + prend un temps significatif pour une chaîne de plus de + 20 caractères. + </para> + </refsect2> </refsect1> </refentry> </reference>