Cet article vous apporte un résumé des connaissances (super détaillé) sur les expressions régulières dans les entretiens PHP. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.
Recommandations associées : "Résumé des questions d'entretien PHP 2019 (collection) "
Introduction
1. Qu'est-ce qu'une expression régulière ?
Une expression régulière est une formule qui utilise un certain modèle pour correspondre à un type de chaîne.
Les expressions régulières utilisent une seule chaîne pour décrire et faire correspondre une série de chaînes qui correspondent à une certaine règle de syntaxe.
Les expressions régulières sont lourdes, mais elles sont puissantes. Après avoir appris, les appliquer améliorera non seulement votre efficacité, mais vous donnera également un sentiment absolu d'accomplissement. Tant que vous lisez attentivement ce tutoriel et faites certaines références lors de son application, la maîtrise des expressions régulières ne pose pas de problème.
De nombreux langages de programmation prennent en charge les opérations sur les chaînes à l'aide d'expressions régulières.
2. Le rôle des expressions régulières
Diviser, rechercher, faire correspondre, remplacer des chaînes
3.
possède deux ensembles de bibliothèques de fonctions d'expressions régulières en PHP. Les fonctions des deux sont similaires, mais l'efficacité d'exécution est légèrement différente :
Un ensemble est composé de PCRE (Perl). Compatible Regular Expression ) fournie par la bibliothèque. Fonctions nommées avec le préfixe "preg_" ;
Un ensemble fourni par les extensions POSIX (Portable Operating System Interface of Unix). Utilisez des fonctions nommées avec le préfixe "ereg_" ;
PCRE est dérivé du langage Perl, et Perl est l'un des langages les plus puissants pour la manipulation de chaînes. La version initiale de PHP était un produit développé par Perl. .
La syntaxe PCRE prend en charge plus de fonctionnalités et est plus puissante que la syntaxe POSIX. Par conséquent, cet article présente principalement l'expression régulière de la syntaxe PCRE
4. La composition des expressions régulières
En PHP, une expression régulière Divisé en trois parties : délimiteurs, expressions et modificateurs de modèle.
Délimiteur
Le délimiteur peut utiliser n'importe quel caractère ascii à l'exception des lettres, des chiffres, de la barre oblique inverse () et des espaces.
Les délimiteurs les plus couramment utilisés sont la barre oblique (/), le symbole dièse (#) et le symbole de négation (~).
L'expression
se compose de quelques caractères spéciaux et de chaînes non spéciales. C'est la partie principale qui détermine les règles de correspondance des expressions régulières.
est utilisé pour activer et désactiver certaines fonctions/modes.
2. Délimiteur
1. Sélection du délimiteur
Lors de l'utilisation de la fonction PCRE, l'expression régulière doit être entourée. par des délimiteurs. Le délimiteur
peut utiliser n'importe quel caractère ASCII à l'exception des lettres, des chiffres, de la barre oblique inverse () et des espaces.
Les délimiteurs les plus couramment utilisés sont la barre oblique (/
), le symbole de hachage (#
) et le symbole de négation (~
).
/foo bar/ (合法) #^[^0-9]$# (合法) +php+ (合法) %[a-zA-Z0-9_-]% (合法)
#[a-zA-Z0-9_-]/ (非法,两边的分隔符不同) a[a-zA-Z0-9_-]a (非法,分隔符不能是字母) \[a-zA-Z0-9_-]\ (非法,分隔符不能是反斜线(`\`))
En plus des délimiteurs mentionnés ci-dessus, vous pouvez également utiliser des délimiteurs de type crochet. Le support gauche et le support droit servent respectivement de délimiteurs de début et de fin. .
{this is a pattern}
Si le délimiteur est utilisé dans une expression régulière, il doit être converti à l'aide d'une barre oblique inverse () juste.
Si des délimiteurs apparaissent fréquemment dans les expressions régulières, il est préférable d'utiliser d'autres délimiteurs pour améliorer la lisibilité.
/http:\/\// #http://#
Lorsque vous devez insérer une chaîne dans une expression régulière, vous pouvez utiliser la fonction preg_quote() pour y échapper. Son deuxième paramètre (facultatif) peut être utilisé pour spécifier le délimiteur qui doit être échappé.
//在这个例子中,preg_quote($word) 用于保持星号和正斜杠(/)原文涵义,使其不使用正则表达式中的特殊语义。 $textBody = "This book is */very/* difficult to find."; $word = "*/very/*"; $reg = "/" . preg_quote($word, '/') . "/"; echo $reg; // 输出 '/\*\/very\/\*/' echo preg_replace ($reg, "<i>" . $word . "</i>", $textBody); // 输出 'This book is <i>*/very/*</i> difficult to find.'
Vous pouvez ajouter des modificateurs de motif après le délimiteur de fin pour affecter l'effet de correspondance.
L'exemple suivant est une correspondance insensible à la casse
#[a-z]#i
3. Métacaractères
1. table>
如果设置了这个修饰符,正则表达式中的字母会进行大小写不敏感匹配。 默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行)。 当这个修饰符设置之后,“行首”元字符 ( 如果目标字符串 中没有 "n" 字符,或者正则表达式中没有出现 默认情况下,点号( 这个修饰符与前面提到的 方法二、使用修饰符 此修正符使正则表达式和目标字符串都被认为是 utf-8 编码。 默认情况下,如果使用 如果设置了这个修饰符,正则表达式中的没有经过转义的或不在字符类中的空白数据字符总会被忽略, 并且位于一个未转义的字符类外部的#字符和下一个换行符之间的字符也被忽略。 如果设置了这个修饰符,正则表达式被强制为"锚定"模式,也就是说约束匹配使其仅从 目标字符串的开始位置搜索。 当一个正则表达式需要多次使用的时候,为了得到匹配速度的提升,值得花费一些时间对其进行一些额外的分析。 使用 输出: 六、正则表达式常用PCRE函数 PHP官网的讲解已经很详细了,这里不再做多余的论述 UTF-8汉字编码范围是 UTF-8要使用 u模式修正符 使模式字符串被当成 UTF-8
Personnage
Description
Marque le caractère suivant comme un caractère spécial, un caractère littéral ou une référence arrière. Par exemple, « n » correspond au caractère « n ». 'n' correspond à un caractère de nouvelle ligne. La séquence '' correspond à "" et "(" correspond à "(".
2. Localisateur
字符
描述
将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用。
例如,'n' 匹配字符 "n"。'n' 匹配一个换行符。序列 '' 匹配 "" 而 "(" 则匹配 "("。3. Qualificateurs
字符
描述
*
匹配前面的子表达式零次或多次。
例如,zo 能匹配 "z" 以及 "zoo"。 等价于{0,}。
+
匹配前面的子表达式一次或多次。
例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
?
当该字符作为量词,表示匹配前面的子表达式零次或一次。
例如,"do(es)?" 可以匹配 "do" 或 "does" 。? 等价于 {0,1}。
{n}
n 是一个非负整数。匹配确定的 n 次。
例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,}
n 是一个非负整数。至少匹配n 次。
例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m}
m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。
例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。4. Caractères communs
字符 描述 d
匹配一个数字字符。等价于 [0-9]
。D
匹配一个非数字字符。等价于 [^0-9]
。w
匹配字母、数字、下划线。等价于 [A-Za-z0-9_]
。W
匹配非字母、数字、下划线。等价于 [^A-Za-z0-9_]
。s
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ fnrtv]
。S
匹配任何非空白字符。等价于 [^ fnrtv]
。.
匹配除换行符(n、r)之外的任何单个字符。
要匹配包括 'n' 在内的任何字符,请使用像"(.n)"的正则表达式。 5. Caractères de branche à choix multiples
字符 描述 n
匹配一个换行符。等价于 x0a 和 cJ。 r
匹配一个回车符。等价于 x0d 和 cM。 t
匹配一个制表符。等价于 x09 和 cI。 6.
字符 描述 | 竖线字符 | 可以匹配多选一的情况。
例如,'z|food' 能匹配 "z" 或 "food"。'(z|f|g)ood' 则匹配 "zood"、"food"或 "good"。7. Groupe de personnages
字符 描述 [x|y] 匹配 x 或 y。
例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。[xyz]
字符集合。匹配所包含的任意一个字符。
例如, [abc]
可以匹配 "plain" 中的 'a'。[^xyz]
负值字符集合。匹配未包含的任意字符。
例如, [^abc]
可以匹配 "plain" 中的'p'、'l'、'i'、'n'。[a-z]
字符范围。匹配指定范围内的任意字符。
例如,[a-z]
可以匹配 'a' 到 'z' 范围内的任意小写字母字符。[^a-z]
负值字符范围。匹配任何不在指定范围内的任意字符。
例如,[^a-z]
可以匹配任何不在 'a' 到 'z' 范围内的任意字符。8. Caractère correspondant non gourmand
字符 描述 ?
当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。
非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。
例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。9.
( )
Regroupement字符 描述 (pattern)
匹配 pattern 并获取这一匹配。要匹配圆括号字符,请使用 (
或 )
。(?:pattern)
匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个正则表达式的各个部分是很有用。
例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。(?=pattern)
正向肯定预查(look ahead positive assert),在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。
例如,"Windows(?=95|98|NT|2000)"能匹配"Windows2000"中的"Windows",但不能匹配"Windows3.1"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。(?!pattern)
正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。
例如"Windows(?!95|98|NT|2000)"能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。(?<=pattern)
反向(look behind)肯定预查,与正向肯定预查类似,只是方向相反。
例如,"(?<=95|98|NT|2000)Windows"能匹配"2000Windows"中的"Windows",但不能匹配"3.1Windows"中的"Windows"。(?<!pattern)
反向否定预查,与正向否定预查类似,只是方向相反。
例如"(?四、模式修饰符
1. i(不区分大小写)
2. m(多行模式)
"行首"元字符 (^
) 仅匹配字符串的开始位置, 而"行末"元字符 ($
) 仅匹配字符串末尾, 或者最后的换行符(除非设置了 D 修饰符)。^
) 和“行末”元字符 ($
) 就会匹配目标字符串中任意换行符之前或之后,另外,还分别匹配目标字符串的最开始和最末尾位置。^
或 $
,设置这个修饰符不产生任何影响。3. s(点号通配模式)
.
)不匹配换行符。
如果设置了这个修饰符,正则表达式中的点号元字符匹配所有字符,包含换行符。4. U(贪婪模式)
?
作用相同,使正则表达式默认为非贪婪匹配,通过量词后紧跟 ?
的方式可以使其转为贪婪匹配。在非贪婪模式,通常不能匹配超过 pcre.backtrack_limit 的字符。
贪婪模式
$str = '<b>abc</b><b>def</b>';
$pattern = '/<b>.*</b>/';
preg_replace($pattern, '\\1', $str);<p><code>.*</code>会匹配 <code>abc</b><b>def</code></p>
<h4><strong>非贪婪模式</strong></h4>
<p><strong>方法一、使用 <code>?</code> 转为非贪婪模式</strong></p>
<pre class="brush:php;toolbar:false">$str = '<b>abc</b><b>def</b>';
$pattern = '/<b>.*?</b>/';
preg_replace($pattern, '\\1', $str);
.*
会分别匹配 abc
,def
U
转为非贪婪模式$str = '<b>abc</b><b>def</b>';
$pattern = '/<b>.*</b>/U';
preg_replace($pattern, '\\1', $str);
5. u(支持UTF-8转义表达)
无效的目标字符串会导致 preg_* 函数什么都匹配不到;无效的正则表达式字符串会导致 E_WARNING 级别的错误。$str = '中文';
$pattern = '/^[\x{4e00}-\x{9fa5}]+$/u';
if (preg_match($pattern, $str)) {
echo '该字符串全是中文';
} else {
echo '该字符串不全是中文';
}
6. D(结尾限制)
$
限制结尾字符,当字符串以一个换行符结尾时, $
符号还会匹配该换行符(但不会匹配之前的任何换行符)。
如果设置这个修饰符,正则表达式中的 $
符号仅匹配目标字符串的末尾。
如果设置了修饰符 m,这个修饰符被忽略。7. x
8. A
9. S
如果设置了这个修饰符,这个额外的分析就会执行。
当前,这种对一个正则表达式的分析仅仅适用于非锚定模式的匹配(即没有单独的固定开始字符)。五、反向引用
( )
标记的开始和结束的多个原子,不仅是一个独立的单元,也是一个子表达式。
在一个 ( )
中的子表达式外面,反斜线紧跟一个大于 0 的数字,就是对之前出现的某个子表达式的后向引用。
后向引用用于重复搜索前面某个 ( )
中的子表达式匹配的文本。1. 在正则表达式中使用反向引用
(sens|respons)e and \1ibility
将会匹配 ”sense and sensibility” 和 ”response and responsibility”, 而不会匹配 ”sense and responsibility”2. 在PCRE函数中使用反向引用
<?php
$str = '<b>abc</b><b>def</b>';
$pattern = '/<b>(.*)<\/b><b>(.*)<\/b>/';
$replace = preg_replace($pattern, '\\1', $str);
echo $replace . "\n";
$replace = preg_replace($pattern, '\\2', $str);
echo $replace . "\n";
abc
def
执行正则表达式匹配 preg_match()
执行正则表达式全局匹配 preg_match_all()
执行一个正则表达式的搜索和替换 preg_replace()
执行一个正则表达式搜索并且使用一个回调进行替换 preg_replace_callback()
执行多个正则表达式搜索并且使用对应回调进行替换 preg_replace_callback_array()
通过一个正则表达式分隔字符串 preg_split()
七、应用实践
1. 正则表达式匹配中文
0x4e00-0x9fa5
在ANSI(GB2312)环境下,0xb0-0xf7
,0xa1-0xfe
在ANSI(GB2312)环境下,要使用chr将Ascii码转换为字符UTF-8
<?php
$str = '中文';
$pattern = '/[\x{4e00}-\x{9fa5}]/u';
preg_match($pattern, $str, $match);
var_dump($match);
ANSI(GB2312)
<?php
$str = '中文';
$pattern = '/['.chr(0xb0).'-'.chr(0xf7).']['.chr(0xa1).'-'.chr(0xfe).']/';
preg_match($pattern, $str, $match);
var_dump($match);
2. 正则表达式匹配页面中所有img标签中的src的值。
<?php
$str = '<img alt="高清大图" id="color" src="color.jpg" />';
$pattern = '/<img.*?src="(.*?)".*?\/?>/i';
preg_match($pattern, $str, $match);
var_dump($match);
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!