>백엔드 개발 >PHP 튜토리얼 >PHP 인터뷰의 정규식에 대한 지식 요약(매우 상세함)

PHP 인터뷰의 정규식에 대한 지식 요약(매우 상세함)

不言
不言앞으로
2019-01-09 10:25:456616검색

이 기사는 PHP 인터뷰에서 정규 표현식에 대한 지식 요약(매우 상세함)을 제공합니다. 이는 특정 참고 가치가 있습니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

관련 추천 : "2019 PHP 면접 질문 요약(모음)"

1. 소개

1. 정규식이란

정규식(Regular Expression)은 특정 A를 사용하는 것입니다. 문자열 유형에 대한 공식과 일치하는 패턴입니다.
정규식은 단일 문자열을 사용하여 특정 구문 규칙과 일치하는 일련의 문자열을 설명하고 일치시킵니다.
정규 표현식은 번거롭지만 강력합니다. 배운 후 적용하면 효율성이 향상될 뿐만 아니라 절대적인 성취감을 느낄 수 있습니다. 이 튜토리얼을 주의 깊게 읽고 이를 적용할 때 특정 참고 자료를 작성하는 한 정규식을 익히는 것은 문제가 되지 않습니다.
많은 프로그래밍 언어는 정규 표현식을 사용한 문자열 연산을 지원합니다.

2. 정규식의 역할

문자열 분할, 검색, 일치, 바꾸기

3. PHP의 정규식

PHP에는 두 가지 정규식 함수 라이브러리 세트가 있습니다. 둘 다 비슷합니다. , 그러나 실행 효율성은 약간 다릅니다:

한 세트는 PCRE(Perl Compatible Regular Expression) 라이브러리에서 제공됩니다.
POSIX(Portable Operating System Interface of Unix) 확장에서 제공하는 집합입니다.

PCRE라는 접두어가 붙은 함수 사용은 Perl 언어에서 유래되었으며 Perl은 문자열 작업을 위한 가장 강력한 언어 중 하나입니다. PHP의 초기 버전은 Perl에서 개발한 제품이었습니다.
PCRE 구문은 POSIX 구문보다 더 많은 기능을 지원하고 더 강력합니다. 따라서 이번 글에서는 PCRE 구문

4의 정규식을 주로 소개합니다. 정규식의 구성

PHP에서 정규식은 구분 기호, 표현식, 패턴 수정자 세 부분으로 나뉩니다.

구분자

구분자는 문자, 숫자, 백슬래시() 및 공백 문자를 제외한 모든 ASCII 문자를 사용할 수 있습니다.
가장 일반적으로 사용되는 구분 기호는 슬래시(/), 해시 기호(#) 및 부정 기호(~)입니다.

expression

은 일부 특수 문자와 특수하지 않은 문자열로 구성됩니다. 정규식의 일치 규칙을 결정하는 주요 부분입니다.

모드 수정자

는 특정 기능/모드를 켜고 끄는 데 사용됩니다.

2. 구분 기호

1. 구분 기호 선택

PCRE 함수를 사용할 때는 정규식을 닫고 구분 기호로 묶어야 합니다.
구분 기호에는 문자, 숫자, 백슬래시() 및 공백 문자를 제외한 모든 ASCII 문자를 사용할 수 있습니다. )和空白字符之外的任意 ascii 字符。
最常用的分隔符有正斜线(/)、hash符号(#) 以及取反符号(~)。

/foo bar/ (合法)
#^[^0-9]$# (合法)
+php+    (合法)
%[a-zA-Z0-9_-]%    (合法)
#[a-zA-Z0-9_-]/    (非法,两边的分隔符不同)
a[a-zA-Z0-9_-]a    (非法,分隔符不能是字母)
\[a-zA-Z0-9_-]\    (非法,分隔符不能是反斜线(`\`))

除了上面提到的分隔符,也可以使用括号样式的分隔符,左括号和右括号分别作为开始和结束 分隔符。

{this is a pattern}

2. 分隔符的使用

如果分隔符 在正则表达式中使用,它必须使用反斜线()进行转义。
果分隔符经常在正则表达式内出现, 最好使用其他分隔符来提高可读性。

/http:\/\//
#http://#

需要将一个字符串放入正则表达式中使用时,可以用 preg_quote() 函数对其进行转义。 它的第二个参数(可选)可以用于指定需要被转义的分隔符。

//在这个例子中,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.'

可以在结束分隔符后面增加模式修饰符来影响匹配效果。

下面的例子是一个大小写不敏感的匹配

#[a-z]#i

三、元字符

1. 转义符

字符 描述
将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用。
例如,'n' 匹配字符 "n"。'n' 匹配一个换行符。序列 '' 匹配 "" 而 "(" 则匹配 "("。

2. 定位符

가장 일반적으로 사용되는 구분 기호는 슬래시(/), 해시 기호(#) 및 부정 기호(~)입니다.
$str = '<b>abc</b><b>def</b>';
$pattern = '/<b>.*</b>/';
preg_replace($pattern, '\1', $str);
$str = '<b>abc</b><b>def</b>';
$pattern = '/<b>.*?</b>/';
preg_replace($pattern, '\1', $str);
위에서 언급한 구분 기호 외에도 괄호 스타일 구분 기호를 사용할 수도 있습니다. 왼쪽 대괄호와 오른쪽 대괄호는 각각 시작 및 끝 구분 기호 역할을 합니다.
字符 描述
^ 匹配输入字符串的开始位置 (或在多行模式下是行首)
$ 匹配输入字符串的结束位置 (或在多行模式下是行尾)
b 匹配一个单词边界,即字与空格间的位置
B
🎜
$str = '<b>abc</b><b>def</b>';
$pattern = '/<b>.*</b>/U';
preg_replace($pattern, '\1', $str);

2. 구분 기호 사용

🎜🎜정규 표현식에서 구분 기호를 사용하는 경우 백슬래시()로 이스케이프해야 합니다. 🎜🎜정규 표현식에 구분 기호가 자주 나타나는 경우 가독성을 높이기 위해 다른 구분 기호를 사용하는 것이 좋습니다. 🎜
$str = '中文';

$pattern = '/^[\x{4e00}-\x{9fa5}]+$/u';

if (preg_match($pattern, $str)) {
    echo '该字符串全是中文';
} else {
    echo '该字符串不全是中文';
}
🎜🎜정규 표현식에 문자열을 넣어야 하는 경우 preg_quote() 함수를 사용하여 이스케이프할 수 있습니다. 🎜 두 번째 매개변수(선택 사항)를 사용하여 이스케이프해야 하는 구분 기호를 지정할 수 있습니다. 🎜
<?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
🎜🎜3.Metacharacters🎜🎜🎜1 이스케이프 문자🎜🎜🎜🎜🎜 다음 문자를 특수 문자 또는 기본 정의 문자 또는 역참조. 🎜예를 들어 'n'은 문자 'n'과 일치합니다. 'n'은 개행 문자와 일치합니다. 시퀀스 ''는 ""와 일치하고 "("는 "("와 일치합니다. 🎜🎜🎜🎜

2. Locator

문자 설명
🎜🎜^🎜🎜는 입력 문자열의 시작 부분(또는 여러 줄 모드에서는 줄의 시작 부분)과 일치합니다. 🎜🎜🎜$🎜🎜입력 문자열의 끝(또는 여러 줄 모드에서는 줄의 끝)과 일치합니다🎜🎜🎜b🎜 🎜 단어 경계, 즉 단어와 공백 사이의 위치를 ​​일치시킵니다.🎜🎜🎜B🎜🎜비단어 경계 일치🎜🎜🎜🎜

3. 한정자

문자 / th> 설명
문자 설명
** 匹配前面的子表达式零次或多次。
例如,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. 通用字符

字符 描述
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. 非打印字符

字符 描述
n 匹配一个换行符。等价于 x0a 和 cJ。
r 匹配一个回车符。等价于 x0d 和 cM。
t 匹配一个制表符。等价于 x09 和 cI。

6. 多选分支符

字符 描述
| 竖线字符 | 可以匹配多选一的情况。
例如,'z|food' 能匹配 "z" 或 "food"。'(z|f|g)ood' 则匹配 "zood"、"food"或 "good"。

7. 字符组

이전 하위 표현식과 0번 이상 일치합니다.
예를 들어 zo는 "z" 및 "zoo"와 일치합니다. {0,}와 동일합니다.
字符 描述
[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]
🎜+🎜🎜 이전 하위 표현식과 한 번 이상 일치합니다.
예를 들어 'zo+'는 'zo' 및 'zoo'와 일치하지만 'z'는 일치하지 않습니다. +는 {1,}과 같습니다. 🎜🎜🎜🎜?🎜🎜이 문자가 수량자로 사용되면 이전 하위 표현식과 0번 또는 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. 범용 문자 🎜🎜🎜🎜🎜Character 🎜🎜Description🎜🎜
🎜🎜🎜🎜🎜🎜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. 인쇄할 수 없는 문자 🎜🎜🎜🎜🎜문자 🎜🎜 설명 🎜🎜🎜🎜🎜🎜n🎜🎜은 개행 문자와 일치합니다. x0a 및 cJ와 동일합니다. 🎜🎜🎜🎜r🎜🎜은 캐리지 리턴 문자와 일치합니다. x0d 및 cM과 동일합니다. 🎜🎜🎜🎜t🎜🎜는 탭 문자와 일치합니다. x09 및 cI와 동일합니다. 🎜🎜🎜🎜🎜6. 다중 선택 분기 기호 🎜🎜🎜🎜🎜Character 🎜🎜Description🎜🎜🎜🎜🎜🎜|🎜🎜세로 막대 문자 |는 여러 선택 항목과 일치할 수 있습니다.
예를 들어 'z|food'는 'z' 또는 'food'와 일치합니다. '(z|f|g)ood'는 "zood", "food" 또는 "good"과 일치합니다. 🎜🎜🎜🎜🎜7. 문자 그룹 🎜🎜🎜🎜🎜Character 🎜🎜Description🎜🎜🎜🎜🎜🎜[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. 탐욕스럽지 않은 일치 문자

Character Description
?? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。
非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。
例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。

9. ( )分组

이 문자 바로 뒤에 다른 제한 기호(*, +, ?, {n}, {n,}, {n,m}), 일치 패턴은 욕심이 없습니다.
字符 描述
(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)Non-greedy 모드는 검색된 문자열과 최대한 일치하는 반면, 기본 Greedy 모드는 검색된 문자열과 최대한 일치합니다.
예를 들어 문자열 "oooo"의 경우 'o+?'는 단일 "o"와 일치하고 'o+'는 모든 'o'와 일치합니다.
🎜9. ( )그룹 🎜🎜🎜🎜🎜Character 🎜🎜Description🎜🎜🎜🎜🎜🎜(패턴)🎜🎜패턴을 일치시켜 이 일치 항목을 얻습니다. . 괄호 문자를 일치시키려면 ( 또는 )를 사용하세요. 🎜🎜🎜🎜(?:pattern)🎜🎜은 패턴과 일치하지만 일치하는 결과를 얻지 못합니다. 즉, 일치하지 않으며 나중에 사용하기 위해 저장되지 않습니다. 이는 "or" 문자(|)를 사용하여 정규식의 일부를 결합할 때 유용합니다. 🎜예를 들어 'industr(?:y|ies)는 'industry|industries'보다 간단한 표현입니다. 🎜🎜🎜🎜(?=pattern)🎜🎜미리 긍정적인 주장을 보고 문자열 일치 패턴의 시작 부분에서 검색 문자열을 일치시킵니다. 이는 가져오지 않는 일치입니다. 즉, 나중에 사용하기 위해 일치 항목을 가져올 필요가 없습니다. 🎜예를 들어 "Windows(?=95|98|NT|2000)"는 "Windows2000"의 "Windows"와 일치할 수 있지만 "Windows3.1"의 "Windows"와는 일치할 수 없습니다. 프리페치는 문자를 소비하지 않습니다. 즉, 일치가 발생한 후 다음 일치 항목에 대한 검색은 프리페치를 포함하는 문자 뒤에서 시작하는 것이 아니라 마지막 일치 직후에 시작됩니다. 🎜🎜🎜🎜(?!pattern)🎜🎜긍정 부정 어설션(부정 어설션)은 패턴과 일치하지 않는 문자열의 시작 부분에 있는 검색 문자열과 일치합니다. 이는 가져오지 않는 일치입니다. 즉, 나중에 사용하기 위해 일치 항목을 가져올 필요가 없습니다. 🎜예를 들어 "Windows(?!95|98|NT|2000)"는 "Windows3.1"의 "Windows"와 일치할 수 있지만 "Windows2000"의 "Windows"와는 일치할 수 없습니다. 프리페치는 문자를 소비하지 않습니다. 즉, 일치가 발생한 후 다음 일치 항목에 대한 검색은 프리페치를 포함하는 문자 뒤에서 시작하는 것이 아니라 마지막 일치 직후에 시작됩니다. 🎜🎜🎜🎜(?<=pattern)🎜🎜역방향(뒤돌아보기) 긍정 조회는 정방향 긍정 조회와 유사하지만 방향이 반대입니다. 🎜예를 들어 "(?<=95|98|NT|2000)Windows"는 "2000Windows"의 "Windows"와 일치할 수 있지만 "3.1Windows"의 "Windows"와는 일치할 수 없습니다. 🎜🎜🎜🎜(?<!pattern)🎜🎜역 부정 사전 확인은 정방향 부정 사전 확인과 유사하지만 반대 방향입니다. 🎜예를 들어 "(?四、模式修饰符

1. i(不区分大小写)

如果设置了这个修饰符,正则表达式中的字母会进行大小写不敏感匹配。

2. m(多行模式)

默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行)。
"行首"元字符 (^) 仅匹配字符串的开始位置, 而"行末"元字符 ($) 仅匹配字符串末尾, 或者最后的换行符(除非设置了 D 修饰符)。

当这个修饰符设置之后,“行首”元字符 (^) 和“行末”元字符 ($) 就会匹配目标字符串中任意换行符之前或之后,另外,还分别匹配目标字符串的最开始和最末尾位置。

如果目标字符串 中没有 "n" 字符,或者正则表达式中没有出现 ^$,设置这个修饰符不产生任何影响。

3. s(点号通配模式)

默认情况下,点号(.)不匹配换行符。
如果设置了这个修饰符,正则表达式中的点号元字符匹配所有字符,包含换行符。

4. U(贪婪模式)

这个修饰符与前面提到的 ? 作用相同,使正则表达式默认为非贪婪匹配,通过量词后紧跟 ? 的方式可以使其转为贪婪匹配。

在非贪婪模式,通常不能匹配超过 pcre.backtrack_limit 的字符。

贪婪模式

$str = '<b>abc</b><b>def</b>';
$pattern = '/<b>.*</b>/';
preg_replace($pattern, '\\1', $str);

.*会匹配 abc</b><b>def

非贪婪模式

方法一、使用 ? 转为非贪婪模式

$str = '<b>abc</b><b>def</b>';
$pattern = '/<b>.*?</b>/';
preg_replace($pattern, '\\1', $str);

.*会分别匹配 abcdef

方法二、使用修饰符 U 转为非贪婪模式

$str = '<b>abc</b><b>def</b>';
$pattern = '/<b>.*</b>/U';
preg_replace($pattern, '\\1', $str);

5. u(支持UTF-8转义表达)

此修正符使正则表达式和目标字符串都被认为是 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

六、正则表达式常用PCRE函数

PHP官网的讲解已经很详细了,这里不再做多余的论述

执行正则表达式匹配 preg_match()

执行正则表达式全局匹配 preg_match_all()

执行一个正则表达式的搜索和替换 preg_replace()

执行一个正则表达式搜索并且使用一个回调进行替换 preg_replace_callback()

执行多个正则表达式搜索并且使用对应回调进行替换 preg_replace_callback_array()

通过一个正则表达式分隔字符串 preg_split()

七、应用实践

1. 正则表达式匹配中文

UTF-8汉字编码范围是 0x4e00-0x9fa5
在ANSI(GB2312)环境下,0xb0-0xf70xa1-0xfe

UTF-8要使用 u模式修正符 使模式字符串被当成 UTF-8
在ANSI(GB2312)环境下,要使用chr将Ascii码转换为字符

UTF-8

<?php

$str = &#39;中文&#39;;

$pattern = &#39;/[\x{4e00}-\x{9fa5}]/u&#39;;

preg_match($pattern, $str, $match);

var_dump($match);

ANSI(GB2312)

<?php

$str = &#39;中文&#39;;

$pattern = &#39;/[&#39;.chr(0xb0).&#39;-&#39;.chr(0xf7).&#39;][&#39;.chr(0xa1).&#39;-&#39;.chr(0xfe).&#39;]/&#39;;

preg_match($pattern, $str, $match);

var_dump($match);

2. 正则表达式匹配页面中所有img标签中的src的值。

<?php

$str = &#39;<img alt="高清大图" id="color" src="color.jpg" />';

$pattern = '/<img.*?src="(.*?)".*?\/?>/i';

preg_match($pattern, $str, $match);

var_dump($match);

위 내용은 PHP 인터뷰의 정규식에 대한 지식 요약(매우 상세함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제