Maison  >  Article  >  développement back-end  >  Que signifie l'expression régulière php ?

Que signifie l'expression régulière php ?

青灯夜游
青灯夜游original
2023-02-08 13:43:254271parcourir

在php中,正则表达式是描述字符排列模式的一种自定义语法规则,自身具有一套非常完整的、可以编写模式的语法体系,提供了一种灵活且直观的字符串处理方法。正则表达式描述的是一种字符串匹配模式,可以用来检查一个字符串中是否含有某种子串、将匹配的子串做替换或者从某个字符串中取出符合某个条件的子串等等。

Que signifie l'expression régulière php ?

本教程操作环境:windows7系统、PHP8版、DELL G3电脑

可能大家之前听说过正则表达式,大概的印象是很难学、很复杂,有种深不可测的感觉。其实正则表达式没有那么神秘,它是描述字符排列模式的一种自定义语法规则。

什么是正则表达式

正则表达式也称为模式表达式,自身具有一套非常完整的、可以编写模式的语法体系,提供了一种灵活且直观的字符串处理方法。正则表达式通过构建具有特定规则的模式,与输入的字符串信息比较,在特定的函数中使用从而实现字符串的匹配、查找、替换及分割等操作。

举个我们在日常生活中的例子,如果想搜索电脑某个目录下的所有 txt 格式的文件,就可以在该目录下输入*.txt,然后按回车键,就可以列出目录下的所有 txt 格式的文件了。这里使用到的*.txt就可以理解为一个简单的正则表达式。

下面使用正则表达式的语法构建了两个例子,如下所示:

/http(s)?:\/\/[\w.]+[\w\/]*[\w.]*\??[\w=&\+\%]*/is      // 匹配网址 URL 的正则表达式
/^\w{3,}@([a-z]{2,7}|[0-9]{3})\.(com|cn)$/                    // 匹配邮箱地址的正则表达式

不要被上例中看似乱码的字符串给吓退,它们就是按照正则表达式的语法规则构建的,是一种由普通字符和具有特殊功能的字符组成的字符串。而且要将这些字符串放在特定的正则表达式函数中使用才有效果。

正则表达式的用途

正则表达式描述的是一种字符串匹配模式,可以用来检查一个字符串中是否含有某种子串、将匹配的子串做替换或者从某个字符串中取出符合某个条件的子串等等。例如,当用户提交一个表单后,要判断输入的电话号码、E-mail 地址等是否有效,用普通的基于字面的字符验证显然是不够的。

正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为“元字符”)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。正则表达式的模式可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。

使用正则表达式的目的就是可以通过简单的办法来实现强大的功能。为了简单、有效而又不失强大,造成了正则表达式规则的复杂,构建正确、有效的正则表达式更是难度较大,所以需要付出一些努力才行。入门之后通过一定的参考和大量实践,在开发实践中使用正则表达式还是比较有效且有趣的。

正则表达式中的常用术语

在学习正则表达式之前,先来了解一下正则表达式中几个容易混淆的术语,这对于学习正则表达式有很大的帮助。

1) grep

最初是 ED 编辑器中的一条命令,用来显示文件中特定的内容。后来成为一个独立的工具 grep。

2) egrep

grep 虽然不断地更新升级,但仍然无法跟上技术的脚步。为此,贝尔实验室写出了 egrep,意为“扩展的 grep"。这大大增强了正则表达式的能力。

3) POSIX(Portable Operating System Interface of UNIX)

可移植操作系统接口。在 grep 发展的同时,其他一些开发人员也根据自己的喜好开发出了具有独特风格的版本。但问题也随之而来,有的程序支持某个元字符,而有的程序则不支持。因此,就有了POSIX。POSIX 是一系列标准,确保了操作系统之间的移植性。不过 POSIX 和 SQL 一样,没有成为最终的标准而只能作为一个参考。

4) Perl(Practical Extraction and Reporting Language)

实际抽取与汇报语言。1987 年,Larry Wall 发布了 Perl。在随后的 7 年时间里,从 Perl1 到现在的 Perl5,最终成为了 POSIX 之后的另一个标准。

5) PCRE

Le succès de Perl a rendu d'autres développeurs compatibles avec "Perl" dans une certaine mesure, notamment C/C++, Java, Python, etc., qui ont tous leurs propres expressions régulières. En 1997, Philip Hazel a développé la bibliothèque PCRE, qui est un ensemble de moteurs d'expressions régulières compatibles avec les expressions régulières Perl. D'autres développeurs peuvent intégrer PCRE dans leurs propres langages pour fournir aux utilisateurs de riches fonctions d'expressions régulières. PCRE est utilisé par de nombreux logiciels, dont PHP.

Règles de syntaxe des expressions régulières

Avant d'utiliser des expressions régulières, nous devons d'abord apprendre la syntaxe des expressions régulières. Les éléments constitutifs des expressions régulières comprennent généralement des caractères ordinaires, des métacaractères, des qualificatifs, des points d'ancrage, des caractères non imprimables et des remplacements spécifiés.

1) Caractères ordinaires

Les caractères ordinaires incluent tous les caractères imprimables et non imprimables qui ne sont pas explicitement désignés comme métacaractères, y compris toutes les lettres majuscules et minuscules, les chiffres, les signes de ponctuation et certains symboles. L'expression régulière la plus simple est un seul caractère ordinaire utilisé pour comparer les chaînes de recherche. Par exemple, l'expression régulière à un seul caractère /A/ correspondra toujours à la lettre A.

Vous pouvez également combiner plusieurs caractères uniques pour former une expression plus longue. Par exemple, l'expression régulière /the/ correspondra au, là, autre et sur le chien paresseux dans la chaîne de recherche. Il n'est pas nécessaire d'utiliser des opérateurs de concaténation, il suffit de saisir les caractères consécutivement.

2) Métacaractères

En plus des caractères ordinaires, les expressions régulières peuvent également contenir des « métacaractères ». Les métacaractères peuvent être divisés en métacaractères à un seul caractère et en métacaractères à plusieurs caractères. Par exemple, le métacaractère d, qui correspond aux caractères numériques.

Tous les métacaractères à un seul caractère sont répertoriés dans le tableau ci-dessous.

métacaractère comportement exemple
* correspond au caractère ou à la sous-expression précédent zéro ou plusieurs fois, équivalent à {0,} zo* avec les correspondances "z" et "zoo"
+ correspond au caractère ou à la sous-expression précédent une ou plusieurs fois, équivalent à {1,} zo+ correspond à "zo" et "zoo" mais pas à "z" Correspond à
? correspond au précédent caractère ou sous-expression zéro ou une fois, équivalent à {0,1}
lorsque ? est suivi de tout autre qualificatif (*, +, ?, {n}, { n,} ou {n,m}), le modèle correspondant est non gourmand. Le modèle non gourmand correspond au moins de chaînes possible, tandis que le modèle gourmand par défaut correspond au plus grand nombre de chaînes possible
zo ? correspond à "z" et "zo", mais pas à "zoo" Ne correspond pas à
o+ Correspond uniquement à a ? "o" unique dans "oooo", tandis que o+ correspond à tous les "o"
do(es) ? Correspond à "do" dans "do" ou "does"
^ correspond au début de la chaîne de recherche. Si le caractère m (recherche multiligne) est inclus dans l'indicateur, ^ correspondra également à la position après n ou r. Si ^ est utilisé comme premier caractère dans une expression entre crochets, le jeu de caractères est annulé ^d{3} correspond aux 3 caractères au début de la chaîne de recherche
[^abc] sauf a, b , tout caractère autre que c correspond à
$ correspond à la fin de la chaîne de recherche. Si le caractère m (recherche multiligne) est inclus dans l'indicateur, ^ correspondra également aux positions précédant n ou r. d{3}$ correspond à 3 chiffres à la fin de la chaîne de recherche
. correspond à n'importe quel caractère à l'exception de la nouvelle ligne n. Pour faire correspondre n'importe quel caractère incluant n, utilisez un modèle comme [sS] a.c correspond à "abc" "a1c" et "a-c"
[] marque le début d'une expression entre parenthèses et la fin [1- 4] correspond à "1", "2", "3" ou "4"
[^aAeEiIoOuU] correspond à n'importe quel caractère non-voyelle
{} expression de qualificatif de marqueur Le début et la fin de l'expression a {2,3} correspond à "aa" et "aaa"
() marque le début et la fin de la sous-expression, vous pouvez enregistrer la sous-expression pour une utilisation future A(d) correspond à "A0" à " A9". Enregistrez ce numéro pour une utilisation ultérieure
| Indique un choix entre deux éléments ou plus z|food correspond à "z" ou "food"
(z|f)ood correspond à "zood" ou "food" matches
/ représente le début et la fin d'un modèle d'expression régulière de texte en JavaScript. L'ajout d'un indicateur à un seul caractère après le deuxième "/" spécifie le comportement de recherche /abc/gi est une expression régulière de texte JavaScript qui correspond à "abc". L'indicateur g (global) spécifie de rechercher toutes les occurrences du modèle, l'indicateur i (ignorer la casse) rend la recherche insensible à la casse
marque le caractère suivant comme caractère spécial, texte, référence arrière ou échappement octal Le caractère n correspond au caractère de nouvelle ligne. ( correspond à "(". \ correspond à ""

Ces caractères spéciaux perdront leur signification lorsqu'ils apparaîtront entre parenthèses et deviendront des caractères ordinaires. Pour faire correspondre ces caractères spéciaux, vous devez d'abord échapper le caractère en le faisant précéder d'une barre oblique inverse. Par exemple, pour rechercher le caractère de texte +, vous utiliserez l’expression +.

En plus des métacaractères à un seul caractère ci-dessus, il existe également des métacaractères à plusieurs caractères, comme indiqué dans le tableau ci-dessous.

métacaractère comportement exemple
b correspond à une limite de mot. Autrement dit, la position entre les mots et les espaces erb correspond au "er" dans "jamais", mais pas au "er" dans "verb"
B Les mots non limitatifs correspondent erB correspond à "verb " Correspond au "er" dans "jamais", mais pas au "er" dans "jamais"
d Correspondance de caractères numériques, équivalent à [0-9] dans la chaîne de recherche "12 345", d {2} correspond à "12" et "34". d correspond à "1", "2", "3", "4" et "5"
D correspond à des caractères non numériques, équivalents à [^0-9] /D+ avec "abc123" abc" et "def" dans "def" correspondent à
w correspond à n'importe quel caractère de A-Z, a-z, 0-9 et un trait de soulignement, équivalent à [A-Za-z0-9] Dans la chaîne de recherche " Le renard brun rapide..." w+ correspond à "The", "quick", "brown" et "fox"
W correspond à tout sauf A-Z, a-z, 0-9 et correspond à n'importe quel caractère sauf le trait de soulignement, équivalent à [^A-Za-z0-9] Dans la chaîne de recherche "Le renard brun rapide...", W+ correspond à "..." et tous les espaces
[xyz] Jeu de caractères, correspond l'un des caractères spécifiés [abc] et correspond au "a" dans "plain"
[^xyz] Jeu de caractères inversé, correspondances non spécifiées Tout caractère correspondant [^abc] Correspond à "p" , "1", "i" et "n" dans "plain"
[a-z] Plage de caractères, correspond à n'importe quel caractère dans la plage spécifiée [a-z] correspond à n'importe quel caractère alphabétique minuscule dans la plage "a " à "z"
[^a-z] plage de caractères inversée, correspond à tout caractère ne se trouvant pas dans la plage spécifiée [^a-z ] Correspond à tout caractère ne se trouvant pas dans la plage "a" à "z"
{n} correspond exactement n fois, n est un entier non négatif o{2} ne correspond pas au "o" dans "Bob" Matches, mais correspond à deux "o" dans "fooood"
{n,} correspond à au moins n fois, où n est un entier non négatif
* est égal à {0,}
+ est égal à {1,}
o{2} ne correspond pas au "o" dans "Bob", mais correspond à tous les "o" dans "fooood"
{n,m} correspond au moins n fois et au plus m fois. n et m sont des entiers non négatifs, où n<= m, il ne peut pas y avoir d'espace entre la virgule et le nombre
est égal à {0,1}
Dans la chaîne de recherche "1234567", d{1, 3} est identique à la correspondance "123", "456" et "7"
(motif) Correspond au modèle et enregistre les correspondances. Les correspondances enregistrées peuvent être récupérées à partir des éléments du tableau renvoyés par la méthode exec en JavaScript. Pour faire correspondre le caractère parenthèse (), utilisez "(" ou ")" (Chapitre|Section) [1-9] Correspond au "Chapitre 5", enregistrez "Chapitre" pour une utilisation future
( ?:motif) correspond au motif mais n'enregistre pas la correspondance, c'est-à-dire que la correspondance n'est pas stockée pour une utilisation future. Ceci est utile lorsque vous combinez des parties de modèle avec le caractère « ou » (|) industry(?:y|ies) est égal à Industry|industries
(?=pattern) Aspect positif. Une fois qu'une correspondance est trouvée, la recherche de la correspondance suivante commence avant le texte correspondant. Les correspondances ne seront pas enregistrées pour une utilisation future ^(?=_.*d.{4,8}$ Appliquez les restrictions suivantes au mot de passe :
Il doit comporter entre 4 et 8 caractères et doit contenir au moins un chiffre. dans le modèle *d recherche n'importe quel nombre de caractères suivis d'un nombre. Pour la chaîne de recherche "abc3qr", faites correspondre "abc3" en commençant avant (pas après) la correspondance, {4, 8} Correspond à une chaîne contenant 4 à 8 caractères. , correspond à "abc3qr"
.^ et $ spécifient les positions de début et de fin de la chaîne de recherche, ce qui empêchera la correspondance si la chaîne de recherche contient des caractères autres que les caractères correspondants
(?! modèle) anticipation négative. Correspond à une chaîne de recherche qui ne correspond pas au modèle. Une fois qu'une correspondance est trouvée, la recherche de la correspondance suivante commence avant le texte correspondant. Les correspondances ne sont pas enregistrées pour une utilisation future b(?!th)/w+b correspond aux mots qui ne commencent pas par "th" Dans ce modèle, b correspond à une limite de mot. Pour la chaîne de recherche « rapide », correspond au premier espace. (?!th) correspond à une chaîne autre que "th" correspond à "qu", en commençant par cette correspondance, !w+ correspond à un mot, c'est-à-dire correspond à "quick"
cx correspond au contrôle indiqué par le caractère x. La valeur de x doit être comprise entre A-Z ou a-z. Sinon, c est supposé être le caractère littéral "c" lui-même cM correspond à Ctrl+M ou un caractère de retour chariot
xn correspond à n, où n est un code d'échappement hexadécimal. Le code d’échappement hexadécimal doit comporter exactement deux chiffres. Les codes ASCII sont autorisés dans les expressions régulières x41 correspond à "A", x41 équivaut à "x04" suivi de "1" (car n doit être exactement deux chiffres)
num correspond à num , où num est un entier positif. Il s'agit d'une référence à une correspondance enregistrée avec (.)1 Une correspondance avec deux caractères identiques consécutifs
n identifie un code d'échappement octal ou une référence arrière. Si n est précédé d'au moins n sous-expressions de capture, alors n est une référence arrière ; sinon, si n est un nombre octal (0-7), alors n est un code d'échappement octal (d)1 avec deux nombres identiques consécutifs correspondant.
nm identifie un code d'échappement octal ou une référence arrière. Si nm est précédé d'au moins nm capturant des sous-expressions, alors nm est une référence arrière. Si nm est précédé d'au moins n sous-expressions de capture, alors n est une référence arrière suivie du texte m. Si aucune des réponses ci-dessus n'est vraie, nm correspond au code d'échappement octal nm 11 lorsque n et m sont des chiffres octaux (0-7) et correspond au caractère de tabulation
nml lorsque n est un chiffre octal (0 -3), m et 1 sont des nombres octaux (0-7), correspondent au code d'échappement octal nml

另外,字符具有高于替换运算符的优先级,例如,允许 "m|food" 匹配 "m" 或 "food"。

替换

正则表达式中的替换允许对两个或多个替换选项之间的选择进行分组。实际上可以在模式中指定两种匹配模式的或关系。可以使用管道|字符指定两个或多个替换选项之间的选择,称之为“替换”。匹配管道字符任一侧最大的表达式。

例如:

/Chapter|Section [1-9][0-9]{0,1}/

该正则表达式匹配的是字符串“Chapter”或者字符串“Section”后跟一个或两个数字。

如果搜索字符串是“Section 22”,那么该表达式匹配“Section 22”。但是,如果搜索字符串是“Chapter 22”,那么表达式匹配单词“Chapter”,而不是匹配“Chapter 22”。

为了解决这种形式的表达式可能带来的误导,可以使用括号来限制替换的范围,即确保它只应用于两个单词“Chapter”和“Section”。可以通过添加括号来使正则表达式匹配“Chapter 1”或“Section 3”。将以上表达式改成如下形式:

/(Chapter|Section) [1-9][0-9]{0,1}/

修改后,如果搜索字符串是“Section 22”,那么该表达式匹配“Section 22”。如果搜索字符串是“Chapter 22”,那么表达式匹配单词也会是“Chapter 22”。

子表达式

正则表达式中放置括号可创建子表达式,子表达式允许匹配搜索文本中的模式并将匹配项分成多个单独的子匹配项,程序可检索生成的子匹配项。

例如匹配邮箱账号的正则表达式:

/(\w+)@(\w+)\.(\w+)/

该正则表达式包含 3 个子表达式,3 个子表达式分别进行匹配并保留匹配结果,与其他表达式匹配结果作为一个整体显示出来。

下面的示例将通用资源指示符(URI)分解为其组件:

/(\w+):\/\/([^\/:]+)(:\d*)?([^# ]*)/
  • 第一个括号子表达式保存 Web 地址的协议部分,匹配在冒号和两个正斜杠前面的任何单词。

  • 第二个括号子表达式保存地址的域地址部分,匹配不包括左斜线/或冒号:字符的任何字符序列。

  • 第三个括号子表达式保存网站端口号(如果指定了的话),匹配冒号后面的零个或多个数字。

  • 第四个括号子表达式保存 Web 地址指定的路径和/或页信息,匹配零个或多个数字字符#或空白字符之外的字符。

如果我们使用这个正则表达式匹配字符串“http://msdn.microsoft.com:80/scripting/default.htm”,那么 3 个子表达式的匹配结果分别为 http、msdn.microsoft.com:80、/scripting/default.htm。

反向引用

反向引用用于查找重复字符组。此外,可使用反向引用来重新排列输入字符串中各个元素的顺序和位置,以重新设置输入字符串的格式。

可以从正则表达式和替换字符串中引用子表达式。每个子表达式都由一个编号来标识,并称作反向引用。

在正则表达式中,每个保存的子匹配项按照它们从左到右出现的顺序存储。用于存储子匹配项的缓冲区编号从 1 开始,最多可存储 99 个子表达式。在正则表达式中,可以使用 \n 来访问每个缓冲区,其中 n 标识特定缓冲区的一位或两位十进制数字。

反向引用的一个应用是,提供查找文本中两个相同单词的匹配项的能力。以下面的句子为例:

Is is the cost of of gasoline going up up?

该句子包含多个重复的单词。如果能设计一种方法定位该句子,而不必查找每个单词的重复出现,就会很有用。

下面的正则表达式使用单个子表达式来实现这一点:

/\b([a-z]+) \1\b/

在此情况下,子表达式是括在括号中的所有内容。该子表达式包括由 [a-z]+ 指定的一个或多个字母字符。正则表达式的第二部分是对以前保存的子匹配项的引用,即单词的第二个匹配项正好由括号表达式匹配。\1 用于指定第一个子匹配项。\b 单词边界元字符确保只检测单独的单词。否则,诸如“is issued”或“this is”之类的词组将不能正确地被此表达式识别。所以,使用表达式 /\b([a-z]+)\1\b/ 匹配字符串“Is is the cost of of gasoline going up up?”得到的结果为 is、of、up。

在 PHP 中使用正则表达式

PHP 有两套函数库支持的正则表达式处理操作:

  • 一套是由 PCRE(Perl Compatible Regular Expression)库提供、与 Perl 语言兼容的正则表达式函数,以preg_为函数的前缀名称;

  • L'autre ensemble est la fonction d'expression régulière à syntaxe étendue POSIX (Portable Operating System Interface), avec ereg_ comme préfixe de la fonction.

Les fonctions des deux bibliothèques de fonctions sont similaires, mais l'efficacité d'exécution de PCRE est supérieure à celle de POSIX, nous introduisons donc uniquement la bibliothèque de fonctions PCRE.

Apprentissage recommandé : "Tutoriel vidéo PHP"

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