>백엔드 개발 >PHP 문제 >PHP 정규식은 무엇을 의미합니까?

PHP 정규식은 무엇을 의미합니까?

青灯夜游
青灯夜游원래의
2023-02-08 13:43:254304검색

PHP에서 정규 표현식은 문자 배열 패턴을 설명하는 사용자 정의 문법 규칙으로, 패턴을 작성할 수 있는 매우 완벽한 문법 시스템을 갖추고 있어 유연하고 직관적인 문자열 처리 방법을 제공합니다. 정규식은 문자열에 특정 하위 문자열이 포함되어 있는지 확인하거나, 일치하는 하위 문자열을 바꾸거나, 문자열에서 특정 조건을 충족하는 하위 문자열을 추출하는 등의 작업에 사용할 수 있는 문자열 일치 패턴을 설명합니다.

PHP 정규식은 무엇을 의미합니까?

이 튜토리얼의 운영 환경: windows7 시스템, PHP8 버전, DELL G3 컴퓨터

아마도 정규 표현식에 대해 들어본 적이 있을 것입니다. 일반적인 인상은 정규 표현식이 배우기 어렵고 매우 복잡하며 헤아릴 수없는 느낌. 사실 정규식은 문자 배열 패턴을 설명하는 사용자 정의 문법 규칙입니다.

정규 표현식이란

정규 표현식은 패턴 표현식이라고도 하며 패턴 작성을 위한 매우 완벽한 문법 시스템을 갖추고 있으며 유연하고 직관적인 문자열 처리 방법을 제공합니다. 정규식은 특정 규칙으로 패턴을 구성하고 이를 입력 문자열 정보와 비교한 후 특정 함수에서 이를 사용하여 문자열 일치, 검색, 대체, 분할 등의 작업을 수행합니다.

일상 생활의 예를 들자면, 컴퓨터의 특정 디렉터리에 있는 모든 txt 형식의 파일을 검색하려면 해당 디렉터리에 *.txt를 입력한 다음 Enter 키를 눌러 해당 파일을 나열하면 됩니다. txt 형식의 모든 파일입니다. 여기에 사용된 *.txt는 간단한 정규식으로 이해될 수 있습니다.

다음 두 예는 아래와 같이 정규식 구문을 사용하여 구성됩니다.

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

위 예에서 겉보기에 왜곡된 문자열로 인해 단념하지 마십시오. 정규식 A의 구문 규칙에 따라 구성됩니다. 일반 문자와 특수 기능을 가진 문자로 구성된 문자열입니다. 그리고 이러한 문자열이 효과적이려면 특정 정규식 함수에 사용해야 합니다.

정규식의 목적

정규식은 문자열에 특정 하위 문자열이 포함되어 있는지 확인하거나, 일치하는 하위 문자열을 바꾸거나, 특정 조건을 충족하는 하위 문자열을 추출하는 데 사용할 수 있는 문자열 일치 패턴을 설명합니다. 특정 문자열 등에서 예를 들어, 사용자가 양식을 제출할 때 입력한 전화번호, 이메일 주소 등이 유효한지 확인하려면 일반적인 문자 기반 문자 확인만으로는 충분하지 않습니다.

정규 표현식은 일반 문자(예: a~z 문자)와 특수 문자("메타 문자"라고 함)로 구성된 텍스트 패턴입니다. 정규식은 검색된 문자열과 문자 패턴을 일치시키는 템플릿 역할을 합니다. 정규식 패턴은 단일 문자, 문자 모음, 문자 범위, 문자 간 선택 또는 이러한 모든 구성 요소의 조합일 수 있습니다.

정규 표현식을 사용하는 목적은 간단한 방법으로 강력한 기능을 구현하는 것입니다. 단순하고 효과적이며 강력하기 위해서는 정규식 규칙이 복잡합니다. 정확하고 효과적인 정규식을 구성하는 것은 더욱 어렵기 때문에 약간의 노력이 필요합니다. 시작한 후에는 일정한 참고와 많은 연습을 통해 개발 실습에서 정규식을 사용하는 것이 매우 효과적이고 흥미로울 것입니다.

정규식에서 자주 사용되는 용어

정규식을 배우기에 앞서, 헷갈리기 쉬운 정규식 용어를 먼저 이해해 두면 정규식 학습에 큰 도움이 될 것입니다.

1) grep

은 원래 파일의 특정 내용을 표시하기 위한 ED 편집기의 명령이었습니다. 나중에 독립형 도구인 grep이 되었습니다.

2) egrep

grep은 지속적으로 업데이트되고 업그레이드되지만 여전히 기술의 속도를 따라잡을 수는 없습니다. 이러한 이유로 Bell Labs는 "확장 grep"을 의미하는 egrep을 작성했습니다. 이는 정규식의 성능을 크게 향상시킵니다.

3) POSIX(UNIX의 휴대용 운영 체제 인터페이스)

휴대용 운영 체제 인터페이스입니다. grep이 발전함에 따라 다른 개발자들도 각자의 선호도에 따라 고유한 스타일을 갖춘 자체 버전을 만들었습니다. 그러나 문제도 발생합니다. 일부 프로그램은 특정 메타 문자를 지원하지만 다른 프로그램은 지원하지 않습니다. 따라서 POSIX. POSIX는 운영 체제 간 이식성을 보장하는 표준 집합입니다. 그러나 POSIX는 SQL과 마찬가지로 최종 표준이 되지 않았으며 참고용으로만 사용될 수 있다.

4) Perl(Practical Extraction and Reporting Language)

실용적인 추출 및 보고 언어입니다. 1987년 Larry Wall은 Perl을 출시했습니다. Perl1부터 현재 Perl5까지 7년 동안 이는 결국 POSIX 이후 또 다른 표준이 되었습니다.

5) PCRE

Perl의 성공으로 인해 C/C++, Java, Python 등을 포함한 다른 개발자들도 "Perl"과 어느 정도 호환 가능해졌으며 모두 고유한 정규식을 가지고 있습니다. 1997년 Philip Hazel은 Perl 정규식과 호환되는 정규식 엔진 세트인 PCRE 라이브러리를 개발했습니다. 다른 개발자는 PCRE를 자신의 언어에 통합하여 사용자에게 풍부한 정규식 기능을 제공할 수 있습니다. PCRE는 PHP를 포함한 많은 소프트웨어에서 사용됩니다.

정규식 구문 규칙

정규식을 사용하기 전에 먼저 정규식의 구문을 배워야 합니다. 정규식의 구성 요소에는 일반적으로 일반 문자, 메타 문자, 한정자, 앵커 포인트, 인쇄되지 않는 문자 및 지정된 대체 문자가 포함됩니다.

1) 일반 문자

일반 문자에는 모든 대문자와 소문자, 숫자, 문장 부호 및 일부 기호를 포함하여 메타 문자로 명시적으로 지정되지 않은 인쇄 가능 및 인쇄 불가능 문자가 모두 포함됩니다. 가장 간단한 정규식은 검색 문자열을 비교하는 데 사용되는 단일 일반 문자입니다. 예를 들어 단일 문자 정규식 /A/는 항상 문자 A와 일치합니다.

여러 개의 단일 문자를 결합하여 더 긴 표현식을 만들 수도 있습니다. 예를 들어 정규식 /the/는 검색 문자열에서 the, there, other 및 over에 일치합니다. 연결 연산자를 사용할 필요 없이 문자를 연속해서 입력하면 됩니다.

2) 메타 문자

일반 문자 외에도 정규식에는 "메타 문자"가 포함될 수 있습니다. 메타 문자는 단일 문자 메타 문자와 다중 문자 메타 문자로 나눌 수 있습니다. 예를 들어 숫자 문자와 일치하는 메타문자 d가 있습니다.

모든 단일 문자 메타 문자는 아래 표에 나열되어 있습니다.

메타 문자 동작
* 는 앞의 문자나 하위 표현식과 0번 이상 일치합니다. 이는 {0,} zo*와 동일하며 "z" 및 "zoo"는 일치합니다.
+ 는 선행 문자 또는 하위 표현식과 한 번 이상 일치합니다. 즉, {1,} zo+는 "zo" 및 "zoo"와 일치하지만 "z"는 일치하지 않습니다.
? 은 이전 문자와 일치합니다. 문자 또는 하위 표현식 0 또는 1개({0,1}
와 동일) ?가 다른 한정자(*, +, ?, {n}, {n,} 또는 {n,m}) 뒤에 오는 경우 일치 패턴은 다음이 아닙니다. 탐욕스러운. non-greedy 패턴은 가능한 한 적은 수의 문자열과 일치하지만, 기본greedy 패턴은 가능한 한 많은 문자열과 일치합니다.
zo?는 "z" 및 "zo"와 일치하지만 "zoo"와 일치하지 않습니다.
o+와 일치합니까? "oooo"의 단일 "o", o+는 모든 "o"와 일치합니다.
do(es)? "do" 또는 "does"의 "do"와 일치합니다.
^ 는 검색 문자열의 시작과 일치합니다. m(여러 줄 검색) 문자가 플래그에 포함된 경우 ^는 n 또는 r 다음의 위치와도 일치합니다. ^가 대괄호 표현식의 첫 번째 문자로 사용되면 문자 집합이 부정됩니다. ^d{3}는 검색 문자열 시작 부분의 3개 문자와 일치합니다.
[^abc] 제외 a, b 이외의 모든 문자 c는
$ 과 일치하며 검색 문자열의 끝과 일치합니다. m(여러 줄 검색) 문자가 플래그에 포함되어 있으면 ^는 n 또는 r 앞의 위치와도 일치합니다. d{3}$는 검색 문자열 끝의 3자리 숫자와 일치합니다.
. 은 개행 n을 제외한 모든 단일 문자와 일치합니다. n을 포함한 모든 문자를 일치시키려면 [sS] a.c와 같은 패턴을 사용하십시오. "abc" "a1c" 및 "a-c"와 일치합니다.
[] 는 대괄호 표현식의 시작을 표시하고 [1- 4]는 "1", "2", "3" 또는 "4"와 일치합니다.
[^aAeEiIoOuU]는 모든 비모음 문자와 일치합니다.
{} 마커 한정자 표현 표현의 시작과 끝 a {2,3}은 "aa" 및 "aaa"와 일치합니다.
() 는 하위 표현식의 시작과 끝을 표시합니다. 나중에 사용할 수 있도록 하위 표현식을 저장할 수 있습니다. A(d)는 "A0"을 "에 일치합니다. A9". 나중에 사용할 수 있도록 이 번호를 저장하세요.
| 둘 이상의 항목 중에서 선택을 나타냅니다. z|food는 "z" 또는 "food"와 일치합니다.
(z|f)ood는 "zood" 또는 "food"와 일치합니다.
/ 일치는 JavaScript에서 텍스트 정규식 패턴의 시작과 끝을 나타냅니다. 두 번째 "/" 뒤에 단일 문자 플래그를 추가하면 검색 동작이 지정됩니다. /abc/gi는 "abc"와 일치하는 JavaScript 텍스트 정규 표현식입니다. g(전역) 플래그는 패턴의 모든 항목을 찾도록 지정하고, i(대소문자 무시) 플래그는 검색에서 대소문자를 구분하지 않게 합니다.
다음 문자를 특수 문자, 텍스트, 역참조 또는 8진수 이스케이프로 표시합니다. n 문자는 개행 문자와 일치합니다. ( "("와 일치. \ ""와 일치

이러한 특수 문자는 대괄호 표현 안에 표시되면 의미를 잃고 일반 문자가 됩니다. 이러한 특수 문자를 일치시키려면 먼저 문자 앞에 백슬래시를 추가하여 문자를 이스케이프해야 합니다. 예를 들어 + 텍스트 문자를 검색하려면 + 표현식을 사용합니다.

위의 단일 문자 메타 문자 외에도 아래 표에 표시된 것처럼 몇 가지 다중 문자 메타 문자도 있습니다.

메타 문자 동작
b 은 단어 경계와 일치합니다. 즉, 단어와 공백 사이의 위치 erb는 "never"의 "er"와 일치하지만 "동사"의 "er"와 일치하지 않습니다.
B 경계가 없는 단어 일치 erB는 "동사와 일치합니다. " "never"의 "er"는 일치하지만 "never"의 "er"는 일치하지 않습니다.
d 숫자 문자 일치, 검색 문자열 "12 345"의 [0-9] 과 동일 , d {2}는 "12" 및 "34"와 일치합니다. d는 "1", "2", "3", "4" 및 "5"와 일치합니다.
D 는 숫자가 아닌 문자와 일치하며 "abc123 "을 사용하는 [^0-9] /D+와 동일합니다. "def" 일치의 abc" 및 "def"
w 는 A-Z, a-z, 0-9 및 밑줄의 모든 문자와 일치하며 [A-Za-z0-9] 와 동일합니다. 검색 문자열 " The Quick Brown Fox..." w+는 "The", "quick", "brown" 및 "fox"와 일치합니다.
W 는 A-Z, a-z, 0-9를 제외한 모든 문자와 일치하며 밑줄을 제외한 모든 문자와 일치합니다. to [^A-Za-z0-9] 검색 문자열 "The Quick Brown Fox..."에서 W+는 "..." 및 모든 공백과 일치합니다
[xyz] 문자 세트, 일치 지정된 문자 [abc] 중 하나 및 "plain"의 "a"와 일치
[^xyz] 역방향 문자 집합, 지정되지 않은 것과 일치 모든 문자 일치 [^abc] "p"와 일치 "plain"의 , "1", "i" 및 "n"
[a-z] 문자 범위, 지정된 범위의 모든 문자와 일치 [a-z] "a 범위의 모든 소문자 알파벳 문자와 일치 " ~ "z"
[^a-z] 역방향 문자 범위, 지정된 범위에 없는 모든 문자와 일치 [^a-z ] "a" ~ "z" 범위에 없는 모든 문자와 일치
{n} 정확히 n번 일치하며, n은 음수가 아닌 정수입니다. o{2}는 "Bob"의 "o"와 일치하지 않지만 "fooood"의 "o" 두 개와 일치합니다.
{n,} 은 최소한 n번 일치합니다. 여기서 n은 음수가 아닌 정수입니다.
*는 {0,}과 같습니다.
+는 {1,}과 같습니다.
o{2}는 일치하지 않습니다. "Bob"의 "o"는 "fooood"의 모든 "o"와 일치합니다.
{n,m} 은 최소 n회, 최대 m회 일치합니다. n과 m은 음수가 아닌 정수입니다. 여기서 n?는 {0,1} 검색 문자열 "1234567"에서 d{1, 3}은 "123", "456" 및 "7" 일치와 동일합니다.
(패턴) 패턴과 일치하고 일치 항목을 저장합니다. 저장된 일치 항목은 JavaScript의 exec 메소드에 의해 반환된 배열 요소에서 검색할 수 있습니다. 대괄호 문자()를 일치시키려면 "(" 또는 ")"를 사용하십시오. (Chapter|Section) [1-9] "Chapter 5"와 일치하고 나중에 사용할 수 있도록 "Chapter"를 저장하십시오.
( ?:pattern) 패턴과 일치하지만 일치 항목을 저장하지 않습니다. 즉, 나중에 사용할 수 있도록 일치 항목이 저장되지 않습니다. 이는 패턴 부분을 "or" 문자(|)와 결합할 때 유용합니다. industry(?:y|ies)는 industry|industries
(?=pattern) Positive Lookahead와 동일합니다. 일치하는 항목이 발견되면 일치하는 텍스트 이전에 다음 일치 항목에 대한 검색이 시작됩니다. 나중에 사용할 수 있도록 일치 항목이 저장되지 않습니다. ^(?=_.*d.{4,8}$ 비밀번호에 다음 제한 사항을 적용하세요.
비밀번호는 4~8자 사이여야 하며 최소한 숫자를 포함해야 합니다. *d 패턴에서 검색 문자열 "abc3qr"에 대해 일치하는 문자 {4~8이 포함된 문자열과 일치합니다. , "abc3qr"
과 일치합니다.^ 및 $는 검색 문자열의 시작 및 끝 위치를 지정합니다. 이는 검색 문자열에 일치하는 문자
(?! 패턴) 부정 예측 이외의 문자가 포함되어 있으면 일치를 방지합니다. 패턴과 일치하지 않는 검색 문자열과 일치합니다. 일치하는 항목이 발견되면 일치하는 텍스트 이전에 다음 일치 항목에 대한 검색이 시작됩니다. 나중에 사용하기 위해 일치 항목이 저장되지 않습니다. b(?!th)/w+b는 "th"로 시작하지 않는 단어와 일치합니다. 이 패턴에서 b는 단어 경계와 일치합니다. 검색 문자열 "quick"의 경우 첫 번째 공백과 일치합니다. (?!th)는 "th"가 아닌 문자열과 일치하고 "qu"와 일치하며, !w+는 단어와 일치합니다. 즉, "quick"과 일치합니다.
cx 은 x 문자로 표시된 컨트롤과 일치합니다. x 값은 A-Z 또는 a-z 범위에 있어야 합니다. 그렇지 않은 경우 c는 텍스트 "c" 문자 자체로 간주됩니다. cM은 Ctrl+M과 일치하거나 캐리지 리턴 문자
xn 는 n과 일치합니다. 여기서 n은 16진수 이스케이프 코드입니다. 16진수 이스케이프 코드는 정확히 두 자리 길이여야 합니다. ASCII 코드는 정규 표현식에서 허용됩니다. x41은 "A"와 일치하고, x41은 "x04" 뒤에 "1"이 오는 것과 같습니다(n은 정확히 두 자리여야 하기 때문입니다).
num 은 num 과 일치합니다. 여기서 num은 a입니다. 양의 정수. (.)1으로 저장된 일치 항목에 대한 참조입니다. 두 개의 연속된 동일한 문자
n 가 포함된 일치 항목은 8진수 이스케이프 코드 또는 역참조를 식별합니다. n 앞에 최소한 n개의 캡처 하위 표현식이 있으면 n은 역참조입니다. 그렇지 않으면 n이 8진수(0-7)이면 n은 두 개의 연속된 동일한 숫자가 일치하는 8진수 이스케이프 코드 (d)1입니다.
nm 은 8진수 이스케이프 코드 또는 역참조를 식별합니다. nm 앞에 최소한 nm 캡처 하위 표현식이 오면 nm은 역참조입니다. nm 앞에 n개 이상의 캡처 하위 표현식이 오면 n은 역참조이고 그 뒤에 텍스트 m이 옵니다. 위의 어느 것도 사실이 아닌 경우, nm은 n과 m이 8진수(0-7)일 때 8진수 이스케이프 코드 nm 11과 일치하고 n이 8진수(0)일 때 탭 문자
nml 과 일치합니다. -3), m과 1은 8진수(0-7)이며, 8진수 이스케이프 코드 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_为函数的前缀名称;

  • 다른 세트는 POSIX(Portable Operating System Interface) 확장 구문 정규식 함수로, ereg_가 함수 접두어로 사용됩니다.

두 함수 라이브러리의 기능은 비슷하지만 PCRE의 실행 효율성이 POSIX보다 높기 때문에 PCRE 함수 라이브러리만 소개합니다.

추천 학습: "PHP 비디오 튜토리얼"

위 내용은 PHP 정규식은 무엇을 의미합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.