Maison  >  Article  >  développement back-end  >  Conseils sur l'utilisation correcte des expressions régulières en PHP

Conseils sur l'utilisation correcte des expressions régulières en PHP

巴扎黑
巴扎黑original
2017-08-09 14:35:261388parcourir
Les expressions régulières constituent un moyen puissant de traiter du texte. À l'aide d'expressions régulières, vous pouvez effectuer une validation complexe des entrées utilisateur, analyser les entrées utilisateur et le contenu des fichiers, et reformater les chaînes. PHP offre aux utilisateurs un moyen simple d'utiliser les expressions régulières POSIX et PCRE. Ce tutoriel aborde les différences entre POSIX et PCRE et explique comment utiliser les expressions régulières avec PHP V5.

Avant de commencer

Découvrez ce que vous pouvez apprendre de ce tutoriel et comment l'utiliser au mieux ce tutoriel.

Conseils sur l'utilisation correcte des expressions régulières en PHPÀ propos de ce didacticiel

Les expressions régulières offrent un moyen puissant de traiter du texte. À l'aide d'expressions régulières, vous pouvez effectuer une validation complexe des entrées utilisateur, analyser les entrées utilisateur et le contenu du texte, et reformater les chaînes.

Conseils sur l'utilisation correcte des expressions régulières en PHPObjectifs

Ce tutoriel se concentrera sur des méthodes simples utilisant les expressions régulières POSIX et PCRE, vous faire maîtrise des expressions régulières de PHP. Nous explorerons les différences entre POSIX et PCRE, et expliquerons également comment utiliser les expressions régulières avec PHP V5. En suivant ce didacticiel, vous apprendrez comment, quand et pourquoi utiliser les expressions régulières.

Conseils sur l'utilisation correcte des expressions régulières en PHPConfiguration système requise

Vous pouvez installer PHP sur n'importe quel Microsoft® Windows® ou suivre ce didacticiel sur un système UNIX®, notamment Mac OS X et Linux®. Étant donné que ce que nous présentons sont tous des plug-ins PHP intégrés, il vous suffit d'installer PHP sur votre système et il n'est pas nécessaire d'installer d'autres logiciels.

Démarrer

Conseils sur l'utilisation correcte des expressions régulières en PHPQu'est-ce qu'une expression régulière ?

Il y a quelques années, j'ai effectué des tests intéressants sur les champs de saisie dans les formulaires Web. L'utilisateur saisira un numéro de téléphone dans ce formulaire. Ce numéro de téléphone sera ensuite imprimé sur l'annonce de l'utilisateur au fur et à mesure de sa saisie. Selon les besoins, les numéros de téléphone américains peuvent être saisis de plusieurs manières : soit (555) 555-5555, soit 555-555-5555, mais le 555-5555 n'est pas accepté.

Vous vous demandez peut-être pourquoi ne pas jeter tous les caractères non numériques et veiller simplement à ce que le total des caractères restants soit de 10 ? Cette approche fonctionne, mais elle n'empêche pas l'utilisateur de taper quelque chose comme !555?333-3333.

Du point de vue d’un développeur Web, cette situation présente un défi intéressant. Je pourrais écrire des routines pour vérifier une variété de formats différents, mais j'aimerais trouver une solution qui permette une certaine flexibilité si l'utilisateur accepte ensuite un format tel que 555.555.5555.

C'est là que les expressions régulières (regex en abrégé) sont utiles. Je les ai déjà copiés et collés dans des applications et je n'ai jamais trouvé de problèmes de syntaxe difficiles à comprendre. Les expressions régulières ressemblent beaucoup à des expressions mathématiques. Lorsque vous voyez une expression de la forme 2x2=4, vous pensez généralement « 2 fois 2 égale 4 ». Les expressions régulières sont très similaires. Après avoir lu cet article, lorsque vous verrez une expression régulière comme celle-ci ^b$, vous vous direz : "Le début d'une ligne est b, puis la fin de la ligne." De plus, vous réaliserez à quel point il est facile d’utiliser des expressions régulières en PHP.

Conseils sur l'utilisation correcte des expressions régulières en PHPQuand utiliser l'expression régulière

Vous devez utiliser l'expression régulière pour effectuer des opérations de recherche et de remplacement lorsqu'il y a des règles à suivre, mais vous n'êtes pas obligé d'avoir la nécessité de rechercher ou de remplacer les caractères exacts. Par exemple, dans l'exemple de numéro de téléphone mentionné ci-dessus, l'utilisateur définit des règles qui indiquent le format du numéro de téléphone saisi, mais pas les chiffres contenus dans le numéro de téléphone. Cela s'applique également aux scénarios impliquant de grandes quantités d'entrées utilisateur. Les abréviations des États américains sont limitées à deux lettres majuscules de A à Z. Les expressions régulières peuvent également être utilisées ici, vous permettant de simplement limiter le texte d'un formulaire ou d'une saisie utilisateur aux lettres de l'alphabet, quels que soient les problèmes de casse ou de longueur.

Conseils sur l'utilisation correcte des expressions régulières en PHPQuand ne pas utiliser les regex

Les expressions régulières sont puissantes, mais elles présentent également quelques défauts. L’un d’eux nécessite des compétences en lecture et en écriture d’expressions. Si vous décidez d'inclure des expressions régulières dans votre candidature, elles doivent être entièrement commentées. De cette façon, si quelqu’un d’autre doit modifier l’expression ultérieurement, il peut le faire sans perturber la fonctionnalité. De plus, si vous n’êtes pas familier avec l’utilisation des expressions régulières, vous pourriez avoir du mal à les déboguer.

Pour éviter ces difficultés, n'utilisez pas d'expressions régulières lorsque des fonctions intégrées plus simples résolvent suffisamment bien le problème.

POSIX et PCRE

PHP prend en charge deux implémentations d'expressions régulières : POSIX (Portable Operating System Implementation) et Perl-Compatible Regular Expression (PCRE). Les deux implémentations offrent des fonctionnalités différentes, mais elles sont tout aussi simples à utiliser en PHP. Le style d'expression régulière que vous utilisez dépend de votre expérience passée et de vos habitudes d'utilisation avec l'expression régulière. Il existe des preuves que les expressions PCRE sont légèrement plus rapides que les expressions POSIX, mais dans la grande majorité des applications, cette différence n'est pas si significative.

Dans les exemples de cet article, la syntaxe de chaque méthode regex est incluse dans les commentaires. Dans la syntaxe de la fonction, l'expression régulière est le paramètre regex et la chaîne recherchée est string. Les paramètres entre parenthèses sont facultatifs. Puisque ce tutoriel présente principalement le contenu de base, il ne donnera pas une introduction à tous les paramètres facultatifs.

Syntaxe des expressions régulières

Bien que les implémentations POSIX et PCRE diffèrent dans leur prise en charge de certaines fonctionnalités et classes de caractères, elles La syntaxe est la même. Chaque expression régulière est composée d'un ou plusieurs caractères, caractères spéciaux (parfois appelés métacaractères ), classes de caractères et groupes de caractères.

POSIX et PCRE utilisent les mêmes caractères génériques - des caractères génériques dans les expressions régulières pour signifier "n'importe quoi ici". Le caractère générique est un point ou un point (.). Pour rechercher des points ou des points anglais, utilisez les caractères d'échappement / : /.. Il en va de même pour les autres caractères spéciaux évoqués ci-dessous, tels que les ancres de ligne et les qualificatifs. Si un caractère a une signification particulière dans une expression régulière, il doit être échappé pour exprimer sa signification littérale d'origine.

Les ancres de ligne sont des métacaractères spéciaux qui correspondent au début et à la fin d'une ligne mais ne capturent aucun texte (voir Tableau 1). Par exemple, si une ligne commence par la lettre a, alors l'ancre de ligne dans l'expression ^a ne capturera pas la lettre a, mais correspondra au début de la ligne.


Conseils sur l'utilisation correcte des expressions régulières en PHP Tableau 1. Ancrages de rangée

描述
^ 匹配一行的开头
$ 匹配一行的结尾

Qualificateur appliqué immédiatement avant son expression (voir tableau 2). À l'aide de qualificatifs, vous pouvez spécifier le nombre de fois qu'une expression est trouvée dans une recherche. Par exemple, l'expression a+ retrouvera la lettre a une ou plusieurs fois.


Conseils sur l'utilisation correcte des expressions régulières en PHPTableau 2. Qualificateurs

限定符 描述
? 限定符之前的表达式可被查找到 0 次或 1 次
+ 限定符之前的表达式可被查找到 1 次或多次
* 限定符之前的表达式可被查找到任意次(含 0 次)
{n} 限定符之前的表达式仅可被查找到 n 次
{n,m} 限定符之前的表达式可被查找到 n 次到 m 次之间

Dans une expression régulière, capturez du texte et référencez-le dans les opérations de remplacement et de recherche Le texte est une fonctionnalité très utile (voir tableau 3). En utilisant la fonction de capture, vous pouvez effectuer des recherches pour trouver des mots en double et fermer les balises HTML et XML. Si vous utilisez la capture lors du remplacement, vous pouvez placer le texte récupéré dans la chaîne de remplacement. Un exemple sera donné plus tard montrant comment remplacer une adresse email par un lien hypertexte.


Conseils sur l'utilisation correcte des expressions régulières en PHPTableau 3. Regroupement et capture

字符类 描述
() 分组字符,并能够捕获文本

Conseils sur l'utilisation correcte des expressions régulières en PHPClasses de caractères POSIX

Les expressions régulières POSIX suivent quelques normes qui les rendent utilisables par de nombreuses implémentations d'expressions régulières (voir Tableau 4). Par exemple, si vous écrivez une expression régulière POSIX, vous pouvez l'utiliser en PHP, vous pouvez l'utiliser via la commande grep et vous pouvez l'utiliser via l'un des nombreux éditeurs prenant en charge les expressions régulières.


Conseils sur l'utilisation correcte des expressions régulières en PHPTableau 4. Classes de caractères POSIX

字符 描述
[:alpha:] 匹配包含字母与数字的字符
[:digit:] 匹配任意数字
[:space:] 匹配任意空白

Correspondance POSIX

a deux fonctions qui utilisent des expressions régulières POSIX pour rechercher des chaînes, à savoir ereg() et eregi(). La méthode

Conseils sur l'utilisation correcte des expressions régulières en PHPereg()

ereg() recherche dans une chaîne une expression régulière spécifique. Si aucune correspondance n'est trouvée, 0 est renvoyé, vous pouvez donc faire un test comme celui-ci :


Conseils sur l'utilisation correcte des expressions régulières en PHPListing 1. méthode ereg()

<?php
$phonenbr="555-555-5555";
// Syntax is ereg( regex, string [, out_captures_array])
if (ereg("[-[:digit:]]{12}", $phonenbr)) {
    print("Found match!/n");
} else {
    print("No match found!/n");
}
?>

Expression régulière[-[:digit:]]{12} trouve 12 caractères qui sont des nombres ou des traits d'union. C'est un peu grossier en ce qui concerne la gestion des numéros de téléphone, mais vous pouvez aussi le réécrire comme ceci : ^[0-9]{3}-[0-9]{3}-[0-9]{4}$. (Dans les expressions régulières, [0-9] et [:digit:] sont en fait identiques, et vous préférerez peut-être utiliser la forme [0-9] car elle est plus courte.) Cette expression alternative est évidemment plus précise. Il recherche le début d'une ligne (^), suivi d'un ensemble de 3 chiffres ([0-9]{3}), d'un trait d'union (-), d'un autre ensemble de 3 chiffres, d'un autre tiret, d'un ensemble de 4 chiffres, puis la fin de la ligne ($). Lorsque vous écrivez des expressions à la main, cela vous donne une idée de la complexité du problème que l'expression régulière tente de résoudre, ce qui peut vous aider à prédire les types de données que vous rechercherez ou remplacerez par l'expression. La méthode

Conseils sur l'utilisation correcte des expressions régulières en PHPeregi()

eregi() est similaire à ereg(), sauf qu'elle n'est pas sensible à la casse. Il renverra un entier contenant la longueur de la correspondance trouvée, mais vous l'utiliserez très probablement dans une instruction conditionnelle, comme ceci :


Conseils sur l'utilisation correcte des expressions régulières en PHP Listing 2. méthode eregi()

<?php
$str="Hello World!";
// Syntax is ereg( regex, string [, out_captures_array])
if (eregi("hello", $str)) {
    print("Found match!/n");
} else {
    print("No match found!/n");
}
?>

Lors de l'exécution de cet exemple, Found match! est affiché car hello. Si vous utilisez , la recherche échouera. ereg

Remplacement POSIX

et ereg_replace() sont deux méthodes pour effectuer des substitutions dans du texte, avec des caractéristiques d'expressions régulières POSIX. eregi_replace()

Conseils sur l'utilisation correcte des expressions régulières en PHPereg_replace()

Vous pouvez utiliser la méthode

pour effectuer des remplacements sensibles à la casse dans la syntaxe des expressions régulières POSIX. L'exemple suivant décrit comment remplacer une adresse e-mail dans une chaîne par un lien hypertexte : ereg_replace()


Conseils sur l'utilisation correcte des expressions régulières en PHPListing 3. Méthode ereg_replace()

<?php
$origstr = "My e-mail address is: first.last@example.com";
// Syntax is: ereg_replace( regex, replacestr, string )
$newstr = /
ereg_replace("([.[:alpha:][:digit:]]+@[.[:alpha:][:digit:]]+)", 
    "<a href=/"mailto://1/">//1</a>", $origstr);
print("$newstr/n");
?>

Il s'agit d'une version incomplète d'une expression régulière pour faire correspondre les adresses e-mail, mais elle montre à quel point

est puissant par rapport à d'autres fonctions de remplacement normales comme str_replace() . Lorsque vous utilisez des expressions régulières, vous définissez des règles de recherche au lieu de caractères littéraux. ereg_replace()

Conseils sur l'utilisation correcte des expressions régulières en PHPeregi_replace()

La fonction

est exactement la même que eregi_replace() sauf que la casse est ignorée : ereg_replace()


Conseils sur l'utilisation correcte des expressions régulières en PHPListing 4. Fonction eregi_replace()


本例将 banana 替换为 pear,替换操作忽略了大小写。

PCRE 字符类

由于 PCRE 语法支持更短的字符类和更多的特性,因此它比 POSIX 语法更为强大。表 5 列出了 PCRE 中支持而在 POSIX 表达式中没有的部分字符类。


Conseils sur l'utilisation correcte des expressions régulières en PHP表 5. PCRE 字符类

字符类 描述
/b 词边界,查找词的开始和结尾
/d 匹配任意数字
/s 匹配任意空白,如 tab 或空格
/t 匹配一个 tab 字符
/w 匹配包含字母与数字的字符

Conseils sur l'utilisation correcte des expressions régulières en PHPPCRE 匹配

PHP 中的 PCRE 匹配函数与 POSIX 匹配函数类似,但如果您习惯使用 POSIX 表达式,那么 PCRE 匹配函数的一项特性可能会使您感到棘手:PCRE 函数要求表达式以分隔符开始和结束。在绝大多数示例中,分隔符都是一个 /,可在引号内表达式的开始和结尾处看到。务必牢记,此分隔符并非表达式的一部分。

在 PCRE 中的最后一个分隔符后,您可添加一个修饰符来更改正则表达式的行为。举例来说,i 修饰符使正则表达式对大小写不敏感。这是与 POSIX 方法的一项重要差异,在 POSIX 中,您需要按照对大小写敏感性的需求来调用不同的方法。

Conseils sur l'utilisation correcte des expressions régulières en PHPpreg_grep()

preg_grep() 方法返回一个数组,其中包含通过正则表达式在其中找到匹配项的另外一个数组的全部项目。如果您有一个较大的值集,并希望对其进行搜索以查找匹配项,那么该方法非常有用。下面是一个示例:


Conseils sur l'utilisation correcte des expressions régulières en PHP清单 5. preg_grep() 方法

<?php
$array = array( "1", "3", "ABC", "XYZ", "42" );
// Syntax is preg_grep( regex, inputarray );
$grep_array = preg_grep("/^/d+$/", $array);
print_r($grep_array);
?>

在本例中,正则表达式 ^/d+$ 查找行的开始(^)和结尾($)之间包含一个或多个数字(/d+)的数组的所有元素。

Conseils sur l'utilisation correcte des expressions régulières en PHPpreg_match()

preg_match() 函数使用 PCRE 在字符串中查找匹配项,它需要两个参数:regex 和字符串。您可以选择提供一个将由匹配项填充的数组、允许您修改匹配操作行为的标志,还可提供字符串中开始查找匹配项的位置(offset)。示例如下:


Conseils sur l'utilisation correcte des expressions régulières en PHP清单 6. offset 方法

<?php
$string = "abcdefgh";
$regex = "/^[a-z]+$/i";
// Syntax is preg_match(regex, string, [, out_matches [, flags [, offset]]]);
if (preg_match($regex, $string)) {
    printf("Pattern &#39;%s&#39; found in string &#39;%s&#39;/n", $regex, $string);
} else {
    printf("No match found in string &#39;%s&#39;!/n", $string);
}
?>

本例使用了正则表达式 ^[a-z]+$,在行的开始(^)和结尾($)之间搜索可查找到一次或多次的([a-z]+)、从 az 的任意字母。

Conseils sur l'utilisation correcte des expressions régulières en PHPpreg_match_all()

preg_match_all() 函数为在字符串中查找到的全部匹配项构建一个数组。下例构建了一个包含句子中全部词的数组:


Conseils sur l'utilisation correcte des expressions régulières en PHP清单 7. preg_match_all() 函数

<?php
$string = "The quick red fox jumped over the lazy brown dog";
$re = "//b/w+/b/";
// Syntax is preg_match_all( regex, string, return_array [, flags [, offset]])
preg_match_all($re, $string, $arrayout);
print_r($arrayout);
?>

正则表达式 /b/w+/b 在词边界(/b)间查找可找到一次或多次的(/w+)单词字符。每个词都将置入输出数组 $arrayout 的一个数组元素中。

PCRE 替换

在 PHP 中进行 PCRE 替换与 POSIX 替换类似,不同之处在于使用的是 preg_replace() 而非 ereg_replace()eregi_replace()

Conseils sur l'utilisation correcte des expressions régulières en PHPpreg_replace()

preg_replace() 函数使用 PCRE 进行替换。它需要这样几个参数:正则表达式、替换表达式和原始字符串。您还可以选择提供希望的最大替换数,以及以所完成的替换数填充的变量。示例如下:


Conseils sur l'utilisation correcte des expressions régulières en PHP清单 8. preg_replace() 函数

<?php
$orig_string = "5555555555";
printf("Original string is &#39;%s&#39;/n", $orig_string);
$re = "/^(/d{3})(/d{3})(/d{4})$/";
// Syntax is preg_replace( regex, replacement, string /
[, limit [, out_count]] );
$new_string = preg_replace($re, "(//1) //2-//3", $orig_string);
printf("New string is &#39;%s&#39;/n", $new_string);
?>

Cet exemple montre rapidement comment capturer une partie du texte et utiliser une référence arrière, telle que //1. Ces références arrière sont insérées dans tout texte correspondant entre parenthèses, dans ce cas, //1 correspond au groupe 1 (/d{3}).

Dans l'exemple, vous pouvez utiliser substr pour diviser le numéro de téléphone avec seulement quelques modifications de la chaîne, il serait plus difficile de compter sur substr pour capturer de manière fiable le texte correct.

Si la chaîne peut être de la forme (555)5555555, vous pouvez modifier l'expression en ^(?(/d{3}))?(/d{3})(/d{4})$ pour trouver des parenthèses.

Conclusion

PHP fournit deux syntaxes pour les expressions régulières : POSIX et PCRE. Ce didacticiel fournit un aperçu général des principales fonctions de PHP prenant en charge les expressions régulières POSIX et PCRE.

À l'aide d'expressions régulières, vous pouvez définir des règles pour effectuer des opérations de recherche et de remplacement plus puissantes, allant bien au-delà de la recherche et du remplacement de texte.

Conseils sur l'utilisation correcte des expressions régulières en PHPRéférences

Apprendre

  • Vous pouvez vous référer au texte original en anglais de cet article sur le site mondial DeveloperWorks.

  • Regular-Expressions.info fournit des informations sur les expressions régulières.

  • PHP : Fonctions d'expression régulière (compatible Perl) - Manuel est un document PHP en ligne couvrant le contenu lié au PCRE.

  • Fonctions d'expression régulières (POSIX étendues) est une documentation PHP en ligne sur POSIX.

  • Visitez les ressources du projet PHP dans DeveloperWorks pour plus d'informations sur PHP.

  • Pour les didacticiels DeveloperWorks sur l'apprentissage de la programmation en PHP, veuillez vous référer à "Apprentissage de PHP, partie 1", Partie 2 et Partie 3.

  • Découvrez les derniers événements techniques et webcasts developerWorks.

  • Visitez DeveloperWorks Open Source Zone pour obtenir de nombreuses informations pratiques, des outils et des mises à jour de projets pour vous aider à utiliser la technologie open source. Développé et utilisé avec les produits IBM.


Obtenez des produits et des technologies

  • via PHP.netTéléchargezla dernière version de PHP. La

  • Bibliothèque d'expressions régulières possède un vaste référentiel d'expressions régulières.

  • Commandez le SEK gratuit pour Linux, qui sont deux DVD contenant le dernier logiciel d'essai d'IBM sur la plate-forme Linux, comprend DB2®, Lotus®, Rational®, Tivoli® et WebSphere®.

  • Innovez dans votre prochain projet open source avec le logiciel d'essai IBM, disponible en téléchargement ou sur DVD.


Discutez

  • Rejoignez la communauté DeveloperWorks en participant aux blogs DeveloperWorks .

Conseils sur l'utilisation correcte des expressions régulières en PHPÀ propos de l'auteur

Nathan A. Good 是明尼苏达州 Twin Cities 的一位作者、软件工程师和系统管理员。他撰写的图书包括与 Lee Babin 等人合著的 PHP 5 Recipes: A Problem-Solution Approach(Apress 出版社,2005 年)、Regular Expression Recipes for Windows Developers: A Problem-Solution Approach(Apress 出版社,2005 年)、Regular Expressions: A Problem-Solution Approach(Apress 出版社,2005 年)及与 Kapil Sharma 等人合著的 Professional Red Hat Enterprise Linux 3(Wrox 出版社,2004 年)。

<.> Nathan A. Good est un auteur, ingénieur logiciel et administrateur système basé à Twin Cities, Minnesota. Ses livres incluent Recettes PHP 5 : une approche problème-solution (Apress, 2005), Recettes d'expressions régulières pour les développeurs Windows : une approche problème-solution(Apress Publishing House, 2005), Expressions régulières : une approche problème-solution(Apress Publishing House, 2005) et Professional Red co-écrit avec Kapil Sharma et al. Hat Enterprise Linux 3 (Wrox Press, 2004).

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn