Index: phpdoc/fr/functions/pcre.xml diff -u phpdoc/fr/functions/pcre.xml:1.2 phpdoc/fr/functions/pcre.xml:1.3 --- phpdoc/fr/functions/pcre.xml:1.2 Sat Jul 22 07:06:14 2000 +++ phpdoc/fr/functions/pcre.xml Mon Nov 13 02:14:14 2000 @@ -1,1534 +1,1729 @@ - - Expressions régulières compatibles Perl - PCRE - - - - La syntaxe des masques utilisés dans ces fonctions ressemble 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 backslash (\). Si un délimiteur doit être utilisé dans - l'expression, il faudra l'échapper avec un backslash. - - - - Le délimiteur final peut être suivi d'options qui affecteront la recherche. - Options de recherche. - - - - - Exemples de masques valides - - /<\/\w+>/ - |(\d{3})-\d+|Sm - /^(?i)php[34]/ - - - - - - - Exemples de masques invalides - - /href='(.*)' - délimiteur final manquant - /\w+\s*\w+/J - option 'J' inconnue - 1-\d3-\d3-\d4| - délimiteur initial manquant - - - - - - - - Les expressions régulières Perl sont disponibles depuis la PHP 4 et PHP 3.0.9. - - - - - - - - preg_match - Expression régulière standard. - - - Description - - int preg_match - string pattern - string subject - array matches - - - preg_match analyse subject - pour trouver l'expression pattern. - - - - Si matches est fourni, il sera rempli par les résultats - de la recherche. $matches[0] contiendra le texte qui satisfait le masque complet, - $matches[1] contiendra le texte qui satisfait la première parenthèse capturante, - etc.. - - - - Retourne TRUE si la recherche à réussie, et FALSE sinon (notamment en cas d'erreur). - - - - - Extraction d'un numéro de page d'une chaîne. - -if (preg_match("/page\s+#(\d+)/i", "Go to page #9.", $parts)) - print "La page suivante est $parts[1]"; -else - print "Page introuvable."; - - - - Voir aussi preg_match_all, preg_replace - et preg_split. - - - - - - - preg_match_all - Expression régulière globale. - - - Description - - int preg_match_all - string pattern - string subject - array matches - int order - - - preg_match_all analyse subject - pour trouver l'expression pattern et met les résultats dans - matches, dans l'ordre spécifié par order. - - - - Après avoir trouvé un premier résultat, la recherche continue jusqu'à la fin de la - chaîne. - - - - order peut prendre une des deux valeurs suivantes : - - - PREG_PATTERN_ORDER - - - L'ordre est tel que $matches[0] est un tableau qui contient les résultats qui - satisfont le masque complet, $matches[1] est un tableau qui contient les - résultats qui satisfont la première parenthèse capturante, etc.. - - -preg_match_all("|<[^>]+>(.*)</[^>]+>|U", "<b>example: </b><div align=left>a test</div>", $out, PREG_PATTERN_ORDER); -print $out[0][0].", ".$out[0][1]."\n"; -print $out[1][0].", ".$out[1][1]."\n" - - - - Cet exemple va afficher : - - -<b>example: </b>, <div align=left>ceci est un test</div> -example: , this is a test - - - - 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 >. - - - - - PREG_SET_ORDER - - - Les résultats sont classés de telle façon que $matches[0] contient la - première série de résultat, $matches[1] contient la deuxième série de - résultat, etc... - - - -preg_match_all("|<[^>]+>(.*)</[^>]+>|U", "<b>exemple: </b><div align=left>a test</div>", $out, PREG_SET_ORDER); -print $out[0][0].", ".$out[0][1]."\n"; -print $out[1][0].", ".$out[1][1]."\n" - - - - Cet exemple va afficher : - - -<b>example: </b>, exemple: -<div align=left>this is a test</div>, this is a test - - - - Dans ce cas, $matches[0] est la première série de résultat, et $matches[0][0] contient le texte qui satisfait le masque complet, $matches[0][1] contient le texte de la première parenthèse capturante, etc. De même, $matches[1] contient le texte qui satisfait le masque complet, etc. * - - - - - - - Si order est omis, PREG_PATTERN_ORDER est utilisé par - défaut. - - - - Retourne le nombre de résultat qui satisfont le masque complet, ou FALSE en cas - d'échec ou d'erreur. - - - - - Extraction de tous les numéros de téléphone d'un texte. - -preg_match_all("/\(? (\d{3})? \)? (?(1) [\-\s] ) \d{3}-\d{4}/x", - "Call 555-1212 or 1-800-555-1212", $phones); - - - - - Voir aussi preg_match, preg_replace - et preg_split. - - - - - - - preg_replace - Rechercher et remplacer par expression régulière standard. - - - Description - - mixed preg_replace - mixed pattern - mixed replacement - mixed subject - - - preg_replace analyse subject pour - trouver l'expression pattern et remplace les résultats par - replacement. - - - - replacement peut contenir des références de la forme - \\n. Ces références seront - remplacées par le texte capturé par la n'-ième - parenthèse capturante du masque. n peut prendre - des valeurs de 0 à 99, et \\0 correspond au texte de qui - satisfait le masque complet. Les parenthèses ouvrantes sont comptées de gauche - à droit (en commencant à 1) pour déterminer le numéro de parenthèse capturante. - - - - Si la recherche n'aboutit à aucun résultat, subject sera - inchangé. - - - - Tous les paramètres de preg_replace peuvent être des - tableaux : - - - - Si subject est un tableau, alors l'opération sera - appliquée à chacun des éléments du tableau, et le tableau sera retourné. - - - - Si pattern et replacement - sont des tableaux, alors preg_replace prend une valeur de - chaque tableau, et l'utilise pour faire la recherche et le remplacement. - Si replacement a moins d'éléments que pattern, - alors la chaîne vide est utilisé pour le reste des valeurs. - Si pattern est un tableau, et que - replacement est une chaîne, alors cette chaîne sera - utilisée pour chaque valeur de pattern. - Le contraire n'aurait pas de sens. - - - - /e force preg_replace à traiter - replacement comme du code PHP une fois que les - substitutions adéquates ont été faites. Conseil :assurez vous que - replacement est un code PHP valide, car sinon, PHP - trouvera une erreur d'analyse (parse error) dans cette ligne. - - - Cette option a été ajoutée en PHP 4.0. - - - - - - - Remplacement de plusieurs valeurs - -$patterns = array("/(19|20\d{2})-(\d{1,2})-(\d{1,2})/", "/^\s*{(\w+)}\s*=/"); -$replace = array("\\3/\\4/\\1", "$\\1 ="); -print preg_replace($patterns, $replace, "{startDate} = 1999-5-27"); - - - - Cet exemple va afficher : - - - $startDate = 5/27/1999 - - - - Utilisation de l'option /e - -preg_replace("/(<\/?)(\w+)([^>]*>)/e", "'\\1'.strtoupper('\\2').'\\3'", $html_body); - - - - Cela va mettre en majuscule toutes les balises HTML du texte. - - - - - Voir aussi preg_match, preg_match_all - et preg_split. - - - - - - - preg_split - Eclatement d'une chaîne par expression régulière. - - - Description - - array preg_split - string pattern - string subject - int limit - int flags - - - - - Le paramètre flags a été ajouté dans PHP Beta 3. - - - - Retourne un tableau contenant les sous chaînes de subject, - séparées par les chaînes qui vérifient pattern. - - - - Si limit est donné, seules les limit - premières chaînes seront retournées. - - - - Si le flag est PREG_SPLIT_NO_EMPTY, alors seul les sous chaînes non nulles - seront retournées. - - - - - Eclatement d'une chaîne de recherche. - -$keywords = preg_split("/[\s,]+/", "hypertext language, programming"); - - - - Voir aussi preg_match, preg_match_all - et preg_replace. - - - - - - - preg_quote - Echappement des caractères spéciaux des expressions régulières. - - - Description - - string preg_quote - string str - - - - preg_quote ajoute un backslash devant tous les caractères de - la chaîne str. Cela est très utile si vous avez une chaîne - qui va servir de masque, mais qui est générée durant l'exécution. - - - - Les caractères spéciaux qui seront échappés : - . \\ + * ? [ ^ ] $ ( ) { } = ! < > | : - - - - Cette fonction a été ajoutée dans PHP 3.0.9. - - - - - - - - preg_grep - Retourne un tableau avec les résultat de la recherche. - - - Description - - array preg_grep - string pattern - array input - - - - preg_grep retourne un tableau qui contient les éléments - de inputqui satisfont le masque - pattern. - - - - - Exemple avec <function>preg_grep</function> - -preg_grep("/^(\d+)?\.\d+$/", $array); // recherche les nombres à virgule flottante - - - - - - Cette fonction a été ajoutée dans PHP 4.0. - - - - - - - Options de recherche - Options disponibles pour les expressions régulières. - - - Description - - Les options de PCRE sont listées ci dessous. Les noms entre parenthèses sont les - noms internes à PCRE. - - - -

- - - i (PCRE_CASELESS) - - - Effectue une recherche insensible à la casse. - - - - - - m (PCRE_MULTILINE) - - - Par défaut, PCRE traite la chaîne sujet comme une seule ligne (même si - cette chaîne contient des retours chariot). Le méta-caractère "début de - ligne" (^) ne sera 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 même fonctionnement qu'en Perl. - - - Lorsque cette option est mise, " début de ligne " et " fin de ligne " - correspondront alors aux caractères suivant et précédent immédiatement un - caractère de nouvelle ligne, en plus du début et de la fin de la chaîne. - C'est le même fonctionnement que l'option Perl /m. - Si il n'y a pas de caractère de nouvelle ligne "\n" dans la chaîne sujet, - ou si il n'y a aucune occurrence de ^ ou $ dans le masque, cette option - ne sert à rien. - - - - - - s (PCRE_DOTALL) - - - Avec cette option, le méta caractère point (.) remplace n'importe quel - caractère, y compris les nouvelles lignes. Sans cette option, le - caractère point ne remplace pas les nouvelles lignes. Cette option est - équivalente à l'option Perl /s. Une classe de caractère négative telle - que [^a] acceptera toujours les caractères de nouvelles lignes, - indépendamment de cette option. - - - - - - x (PCRE_EXTENDED) - - - Avec cette option, les caractères d'espacement sont ignorés, sauf - lorsqu'ils sont échappés, ou à l'intérieur d'une classe de caractère, et - tous les caractères entre # non échappés et en dehors d'une classe de - caractère, et le prochain caractère de nouvelle ligne sont ignorés. C'est - l'équivalent Perl de l'option /x : elle permet l'ajout de commentaires - dans les masques compliqués. Notez bien, cependant, que cela ne - s'appliquent qu'aux caractères de données. Les caractères d'espacement - ne doivent jamais apparaître dans les séquences spéciales d'un masque, - comme par exemple dans la séquence (?( qui introduit une parenthèse - conditionnelle. - - - - - - e - - - Avec cette option, preg_replace effectue la - substitution normale des \\ dans la chaîne de remplacement, puis - l'évalue comme un code PHP, et utilise le résultat pour remplacer la - chaîne de recherche. - - - Seule preg_replace utilise cette option. Elle est - ignorée par les autres. + + Expressions régulières compatibles Perl + PCRE + + + + La syntaxe des masques utilisés dans ces fonctions ressemble + 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 backslash (\). + Si un délimiteur doit être utilisé dans + l'expression, il faudra l'échapper avec un backslash. + + + Le délimiteur final peut être suivi d'options qui + affecteront la recherche. + Options de recherche. + + + + Exemples de masques valides + + /<\/\w+>/ + |(\d{3})-\d+|Sm + /^(?i)php[34]/ + + + + + + Exemples de masques invalides + + + + /href='(.*)' - délimiteur final manquant + + + + + /\w+\s*\w+/J - option 'J' inconnue + + + + + 1-\d3-\d3-\d4| - délimiteur initial manquant + + + + + + + + Les expressions régulières Perl sont disponibles + depuis la PHP 4 et PHP 3.0.9. + + + + + + + preg_match + Expression régulière standard. + + + Description + + + int preg_match + string pattern + string subject + array + matches + + + + + preg_match analyse subject + pour trouver l'expression pattern. + + + Si matches est fourni, il sera rempli par + les résultats de la recherche. $matches[0] contiendra le + texte qui satisfait le masque complet, $matches[1] contiendra + le texte qui satisfait la première parenthèse capturante, + etc.. + + + Retourne TRUE si la recherche à réussie, et + FALSE sinon (notamment en cas d'erreur). + + + + Extraction d'un numéro de page d'une chaîne. + +if (preg_match("/page\s+#(\d+)/i", "Go to page #9.", $parts)) + print "La page suivante est $parts[1]"; +else + print "Page introuvable."; + + + + Trouve le mot "web" + +// \b, dans le masque, indique une limite de mot, de faon ce que le mot +// "web" uniquement soit repr, et pas seulement des parties de mots comme +// dans "webbing" ou "cobweb" +if (preg_match ("/\bweb\b/i", "PHP est le meilleur langage de script du web.")) { + print "Un mot a t trouv."; +} else { + print "Un mot n'a pas t trouv."; +} +if (preg_match ("/\bweb\b/i", "PHP est le meilleur langage de script pour les webagency.")) { + print "Un mot a t trouv."; +} else { + print "Un mot n'a pas t trouv."; +} + + + + Lire un nom de domaine dans une URL + +// reprer le nom de l'hte dans l'URL +preg_match("/^(http:\/\/)?([^\/]+)/i", +"http://www.php.net/index.html", $matches); +$host = $matches[2]; +// reprer les deux derniers segments du nom de l'hte +preg_match("/[^\.\/]+\.[^\.\/]+$/",$host,$matches); +echo "Le nom de domaine est : ".$matches[0]."\n"; + + + Cet exemple va afficher : + +Le nom de domaine est : php.net + + Voir aussi preg_match_all, + preg_replace + et preg_split. + + + + + + + preg_match_all + Expression régulière globale. + + + Description + + + int preg_match_all + string pattern + string subject + array matches + int + order + + + + + preg_match_all analyse subject + pour trouver l'expression pattern + et met les résultats dans matches, + dans l'ordre spécifié par order. + + + Après avoir trouvé un premier résultat, + la recherche continue jusqu'à la fin de la chaîne. + + + order peut prendre une des deux valeurs suivantes : + + + PREG_PATTERN_ORDER + + + L'ordre est tel que $matches[0] est un tableau qui + contient les résultats qui satisfont le masque + complet, $matches[1] est un tableau qui contient les + résultats qui satisfont la première + parenthèse capturante, etc.. + + +preg_match_all("|<[^>]+>(.*)</[^>]+>|U", "<b>example: </b><div align=left>a test</div>", $out, PREG_PATTERN_ORDER); +print $out[0][0].", ".$out[0][1]."\n"; +print $out[1][0].", ".$out[1][1]."\n" + + + Cet exemple va afficher : + + +<b>exemple: </b>, <div align=left>ceci est un test</div> +exemple: , ceci est un test + + + 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 <. + + + + + PREG_SET_ORDER + + + Les résultats sont classés de telle + façon que $matches[0] contient la première + série de résultat, $matches[1] contient la + deuxième série de résultat, etc... + + +preg_match_all("|<[^>]+>(.*)</[^>]+>|U", "<b>exemple: </b><div align=left>a test</div>", $out, PREG_SET_ORDER); +print $out[0][0].", ".$out[0][1]."\n"; +print $out[1][0].", ".$out[1][1]."\n" + + + Cet exemple va afficher : + + +<b>example: </b>, exemple: +<div align=left>this is a test</div>, this is a test + + + Dans ce cas, $matches[0] est la première série de + résultat, et $matches[0][0] contient le texte qui satisfait + le masque complet, $matches[0][1] contient le texte de la + première parenthèse capturante, etc... De même, + $matches[1] contient le texte qui satisfait le masque complet, etc. + + + + + + + Si order est omis, PREG_PATTERN_ORDER est + utilisé par défaut. + + + Retourne le nombre de résultat qui satisfont le masque + complet, ou FALSE en cas d'échec ou d'erreur. + + + + + Extraction de tous les numéros de téléphone d'un texte. + + +preg_match_all("/\(? (\d{3})? \)? (?(1) [\-\s] ) \d{3}-\d{4}/x", + "Call 555-1212 or 1-800-555-1212", $phones); + + + + + + Recherche les couples de balises HTML (gourmand) + +// Cet exemple utilise les rfrences arrires (\\2). Elles indiquent +// l'analyseur qu'il doit trouver quelquechose qu'il a dj repr un peu +// plus tt (ici, ([\w]+)). +$html = "<b>bold text</b><a href=salut.html>clique moi</a> + +preg_match_all ("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $matches); + +for ($i=0; $i< count($matches[0]); $i++) { +echo "trouv: ".$matches[0][$i]."\n"; +echo "partie 1: ".$matches[1][$i]."\n"; +echo "partie 2: ".$matches[3][$i]."\n"; +echo "partie 3: ".$matches[4][$i]."\n\n"; +} + + + Cet exemple va produire : + +trouv: <b>bold text</b> +partie 1: <b> +partie 2: bold text +partie 3: </b> + +trouv: <a href=salut.html>clique moi</a> +partie 1: <a href=salut.html> +partie 2: clique moi +partie 3: </a> + + + + Voir aussi preg_match, + preg_replace + et preg_split. + + + + + + + preg_replace + Rechercher et remplacer par expression régulière standard. + + + Description + + + mixed preg_replace + mixed pattern + mixed replacement + mixed subject + int + limit + + + + + preg_replace analyse subject + pour trouver l'expression pattern et remplace les + résultats par replacement. + + + replacement peut contenir des + références de la forme + \\n. Ces + références seront remplacées par le texte + capturé par la n'-ième + parenthèse capturante du masque. n + peut prendre des valeurs de 0 à 99, et \\0 + correspond au texte de qui satisfait le masque complet. Les + parenthèses ouvrantes sont comptées de gauche + à droit (en commencant à 1) pour déterminer + le numéro de parenthèse capturante. + + + Si la recherche n'aboutit à aucun résultat, + subject sera inchangé. + + + Tous les paramètres de preg_replace + peuvent être des tableaux. + + + Si subject est un tableau, alors l'opération + sera appliquée à chacun des éléments du + tableau, et le tableau sera retourné. + + + Si pattern et replacement + sont des tableaux, alors preg_replace prend une valeur + de chaque tableau, et l'utilise pour faire la recherche et le remplacement. + Si replacement a moins d'éléments + que pattern, alors la chaîne vide est + utilisé pour le reste des valeurs. Si pattern + est un tableau, et que replacement est une + chaîne, alors cette chaîne sera utilisée pour + chaque valeur de pattern. + Le contraire n'aurait pas de sens. + + + /e force preg_replace + à traiter replacement comme du + code PHP une fois que les substitutions adéquates ont + été faites. Conseil :assurez vous que + replacement est un code PHP valide, car sinon, PHP + trouvera une erreur d'analyse (parse error) dans cette ligne. + + + + Remplacement de plusieurs valeurs + +$patterns = array ("/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/", + "/^\s*{(\w+)}\s*=/"); +$replace = array ("\\3/\\4/\\1\\2", "$\\1 ="); +print preg_replace ($patterns, $replace, "{startDate} = 1999-5-27"); + + + Cet exemple va afficher : + + $startDate = 5/27/1999 + + + Utilisation de l'option /e + +preg_replace("/(<\/?)(\w+)([^>]*>)/e", "'\\1'.strtoupper('\\2').'\\3'", $html_body); + + + Cela va mettre en majuscule toutes les balises HTML du texte. + + + + Conversion HTML en text + +// $document contient un document HTML +// Ce script va effacer les balises HTML, les javascript +// et les espaces. Il remplace aussi queqlues entites HTML +// courante en leur quivalent texte. + +$search = array ("'<script[^>]*?>.*?</script>'si", // Supprime le javascript + "'<[\/\!]*?[^<>]*?>'si", // Supprime les balises HTML + "'([\r\n])[\s]+'", // Supprime les espaces + "'&(quot|#34);'i", // Supprime les entitees HTML + "'&(amp|#38);'i", + "'&(lt|#60);'i", + "'&(gt|#62);'i", + "'&(nbsp|#160);'i", + "'&(iexcl|#161);'i", + "'&(cent|#162);'i", + "'&(pound|#163);'i", + "'&(copy|#169);'i", + "'&#(\d+);'e"); // Evaluation comme PHP + +$replace = array ("", + "", + "\\1", + "\"", + "&", + "<", + ">", + " ", + chr(161), + chr(162), + chr(163), + chr(169), + "chr(\\1)"); + +$text = preg_replace ($search, $replace, $document); + + + + + + Le paramtre limit a t ajout + partir de PHP 4.0.1pl2. + + + + Voir aussi preg_match, + preg_match_all + et preg_split. + + + + + + + preg_split + + Eclatement d'une chaîne par expression régulière. + + + + Description + + + array preg_split + string pattern + string subject + int + limit + + int + flags + + + + + + + Le paramètre flags a été + ajouté dans PHP Beta 3. + + + + + Retourne un tableau contenant les sous chaînes + de subject, séparées + par les chaînes qui vérifient pattern. + + + + Si limit est donné, seules + les limit premières chaînes + seront retournées. + + + + Si le flag est PREG_SPLIT_NO_EMPTY, alors seul les sous chaînes + non nulles seront retournées. + + + + + Eclatement d'une chaîne de recherche. + +// scinde la phrase grce aux virgules et espacements +// ce qui inclus les " ", \r, \t, \n et \f +$keywords = preg_split ("/[\s,]+/", "langage hypertexte, programmation"); + + + + + Scinder une chane en caractres + + +$str = 'string'; +$chars = preg_split('//', $str, 0, PREG_SPLIT_NO_EMPTY); +print_r($chars); + + + + Voir aussi preg_match, + preg_match_all + et preg_replace. + + + + + + + + preg_quote + + Echappement des caractères spéciaux des expressions régulières. + + + + Description + + + string preg_quote + string str + string + delimiter + + + + + preg_quote ajoute un backslash devant tous + les caractères de la chaîne str. + Cela est très utile si vous avez une chaîne qui va + servir de masque, mais qui est générée durant + l'exécution. + + + Si l'argument optionnel delimiter est fourni, + il sera aussi chapp. Ceci est pratique pour chapper le dlimiteur + requis par les fonctions PCRE. Le slash / est le dlimiteur le + plus rpandu. + + + Les caractères spéciaux qui seront échappés : + . \\ + * ? [ ^ ] $ ( ) { } = ! < > | : + + + + +$keywords = "$40 pour un g3/400"; +$keywords = preg_quote ($keywords, "/"); +echo $keywords; // retourne \$40 pour un g3\/400 + + + + Mise en italique d'un mot dans un texte + + +// Dans cet exemple, preg_quote($word) sert viter que les astrisques +// prennent une valeur particulire dans l'exepression +// rgulire. + +$textbody = "Ce livre est *trs* difficile trouver."; +$word = "*trs*"; +$textbody = preg_replace ("/".preg_quote($word)."/", + "<i>".$word."</i>", + $textbody); + + + + + + + + + preg_grep + Retourne un tableau avec les résultat de la recherche. + + + Description + + + array preg_grep + string pattern + array input + + + + + preg_grep retourne un tableau qui + contient les éléments de input + qui satisfont le masque pattern. + + + + + Exemple avec <function>preg_grep</function> + +// recherche les nombres à virgule flottante +preg_grep("/^(\d+)?\.\d+$/", $array); + + + + + + + + Options de recherche + + Options disponibles pour les expressions régulières. + + + + Description + + Les options de PCRE sont listées ci dessous. Les noms entre + parenthèses sont les noms internes à PCRE. + + +
+ + + i (PCRE_CASELESS) + + + Effectue une recherche insensible à la casse. + + + + + m (PCRE_MULTILINE) + + + Par défaut, PCRE traite la chaîne sujet comme une seule + ligne (même si cette chaîne contient des retours chariot). + Le méta-caractère "début de ligne" (^) ne sera + 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 + même fonctionnement qu'en Perl. + + + Lorsque cette option est mise, " début de ligne " et + " fin de ligne " correspondront alors aux caractères + suivant et précédent immédiatement un + caractère de nouvelle ligne, en plus du début + et de la fin de la chaîne. C'est le même + fonctionnement que l'option Perl /m. Si il n'y a pas de + caractère de nouvelle ligne "\n" dans la chaîne sujet, + ou si il n'y a aucune occurrence de ^ ou $ dans le masque, cette option + ne sert à rien. + + + + + s (PCRE_DOTALL) + + + Avec cette option, le méta caractère point (.) + remplace n'importe quel caractère, y compris les nouvelles + lignes. Sans cette option, le caractère point ne remplace + pas les nouvelles lignes. Cette option est équivalente + à l'option Perl /s. Une classe de caractère + négative telle que [^a] acceptera toujours les + caractères de nouvelles lignes, indépendamment + de cette option. + + + + + x (PCRE_EXTENDED) + + + Avec cette option, les caractères d'espacement sont + ignorés, sauf lorsqu'ils sont échappés, + ou à l'intérieur d'une classe de caractère, + et tous les caractères entre # non échappés + et en dehors d'une classe de caractère, et le prochain + caractère de nouvelle ligne sont ignorés. C'est + l'équivalent Perl de l'option /x : elle permet l'ajout + de commentaires dans les masques compliqués. Notez bien, + cependant, que cela ne s'appliquent qu'aux caractères de + données. Les caractères d'espacement ne doivent + jamais apparaître dans les séquences spéciales + d'un masque, comme par exemple dans la séquence (?( qui + introduit une parenthèse conditionnelle. - - - Cette option a été ajoutée dans PHP 4.0. - - - - - - - A (PCRE_ANCHORED) - - - Avec cette option, le masque est ancré de force, c'est à dire que le masque - doit s'appliquer entre le début et la fin de la chaîne sujet pour être - considéré comme trouvé. Il est possible de réaliser le même effet en - ajoutant les méta-caractères adéquats, ce qui est la seule manière de le - faire en Perl. - - - - - - E (PCRE_DOLLAR_ENDONLY) - - - Avec cette option, le méta-caractère $ ne sera valable qu'à la fin de la - chaîne sujet. Sans cette option, $ est aussi valable avant une nouvelle - ligne, si cette dernière est le dernier caractère de la chaîne. Cette option - est ignorée si l'option m est mise. Il n'y a pas - d'équivalent en Perl. - - - - - - S - - - Lorsqu'un masque est utilisé plusieurs fois, cela vaut la peine de passer - quelques instants de plus pour l'analyser et optimiser le code pour accélérer - les traitements ultérieurs. Cette option force cette analyse plus poussée. - Actuellement, cette analyse n'est utile que pour les masques non ancrés, qui - ne commencent pas par un caractère fixe. - - - - - - U (PCRE_UNGREEDY) - - - Cette option inverse la tendance à la gourmandise des expressions 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). - - - - - - X (PCRE_EXTRA) - - - Cette option ajoute d'autres fonctionnalités incompatible avec le PCRE de - Perl. Tous les backslash suivis d'une lettre qui n'aurai pas de signification - particulière cause une erreur, permettant la réservation de ces combinaisons - pour des ajouts fonctionnels ultérieurs. Par défaut, comme en Perl, les - backslash suivi d'une lettre sans signification particulière sont traités - comme des valeurs litérales. Actuellement, cette option ne déclenche pas - d'autres fonctions. - - - - -
-
-
- - - - Syntaxe des masques - Fonctionnement des expressions régulières. - - - Description - - 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. - - - - Différences avec Perl - - Les différences avec le Perl 5.005 sont présentée ici : - - 1. Par défaut, un caractère d'espacement correspond à n'importe quel caractère - que la fonction C isspace() reconnaît, bien qu'il soit possible de recompiler - la bibliothèque PCRE avec d'autres tables de caractères. Normalement, isspace() - retourne TRUE pour les espaces, les retours chariot, les nouvelles lignes, les - formfeed, les tabulations verticales et horizontales. Le Perl 5 n'accepte plus - la tabulation verticale comme caractère d'espacement. La séquence \v qui était - dans la documentation Perl depuis longtemps n'a jamais été reconnue. Cependant, - la tabulation verticale elle-même était reconnue comme un caractère d'espacement - jusqu'à la version 5.002. Avec les version 5.004 et 5.005, l'option \s l'ignore. - - 2. PRCE ne tolère pas la répétition de quantificateurs dans les expressions. Perl - le permet, mais cela ne signifie pas ce que vous pourriez penser. Par exemple, - (?!a){3} ne s'interprète pas : les trois caractères suivants ne sont pas des - "a". En fait, cela s'interprète comme : le caractère suivant n'est pas "a" trois - fois. - - 3. Les occurrences de sous-masques qui interviennent dans des assertions négatives - sont comptées, mais elles ne sont pas enregistrées dans le vecteur - d'occurrences. Perl modifie ses variables numériques pour toutes les occurrences - de sous masque, avant que l'assertion ne vérifie le masque entier, et - uniquement si les sous masques ne trouvent qu'une seule occurrence. - - 4. Bien que les caractères nul soient tolérés dans la chaîne de recherche, ils ne - sont pas acceptés dans le masque, car le masque est utilisé comme une chaîne C - standard, terminée par le caractère nul. Il faut donc utiliser la séquence - d'échappement "\0" dans le masque pour rechercher les caractères nul. - - 5. Les séquence d'échappement suivantes ne sont pas supportées par le Perl: \l, - \u, \L, \U, \E, \Q. En fait, elles sont implémentées par la gestion intrinsèque - de chaînes du Perl, et ne font pas partie de ses caractères spéciaux. - - 6. L'assertion \G du Perl n'est pas supportée car elle n'est pas pertinente pour - faire des recherches avec des masques uniques. - - 7. De manière assez évidente, PCRE n'accepte pas la construction (?{code}) - - 8. Au moment de l'écriture de PCRE, Perl 5.005_02 avait quelques comportement - étranges avec la capture des chaînes lorsqu'une partie du masque est redoublée. - Par exemple, "aba" avec le masque /^(a(b)?)+$/ va affecter à $2 la valeur "b", - mais la même manipulation avec "aabbaa" et /^(aa(bb)?)+$/ laissera $2 vide. - Cependant, si le masque est remplacé par /^(aa(b(b))?)+$/ alors $2 (et - d'ailleurs $3) seront correctement affectés. Avec le Perl 5.004, $2 sera - correctement affecté dans les deux cas, et c'est aussi vrai avec PCRE. Si Perl - évolue vers un autre comportement cohérent, PCRE s'adaptera probablement - - 9. Une autre différence encore non résolue est le fait qu'en Perl 5.005_02 le - masque /^(a)?(?(1)a|b)+$/ accepte la chaîne "a", tandis que PCRE ne l'accepte - pas. Cependant, que ce soit avec Perl ou PCRE /^(a)?a/ et "a" laisseront $1 - vide. - - 10. PCRE propose quelques extensions aux expressions régulières du Perl. - (a) Bien que les assertions avec retour (lookbehind) soit obligée d'apparier - une chaîne de longueur fixe, toutes les assertions avec retour peuvent avoir - une longueur différente. Perl 5.005 leur impose d'avoir toutes la même longueur. - (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 physqiue de la chaîne, et non - pas avant les caractères de nouvelle ligne. - (c) Si PCRE_EXTRA est mis, un backslash suivi d'une lettre sans signification - spéciale est considérée comme une erreur. - (d) SI PCRE_UNGREEDY est mis, 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. - - - - - Détails sur les expressions régulières - - 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 meta-characters, - 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 : - -BACKSLASH - Le caractère backslash a de nombreuses utilisations. En premier lieu, si 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 du backslash 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 s'applique dans tous les cas, que le caractère qui suive - soit un méta-caractère ou non. C'est un moyen sur 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 backslash, 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. Le backslash peut être - utilisé pour échapper et ainsi rechercher un espace ou un dièse. - - La deuxième utilité du backslash 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 référence de retour. 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 du backslash, 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 backslash 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, - 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 du backslash 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 backslash 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 - 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é - (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 backslash. - - 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 backslash. - - 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 - backslash, 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 backslash, 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 - 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. - - 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. - - - -SUBPATTERNS - - 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 grce à 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. - - 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,} - - 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} - - 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 - - /\*.*\*/ - - à 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 backslash 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 le backslash 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 "Backslash" pour avoir - de plus amples détails à propos du nombre de chiffres qui suivent le backslash. - - 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 le backslash 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 - 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