English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 튜토리얼에서는 정규 표현식의 작동 방식과 PHP에서 효율적으로 패턴 매칭을 수행하는 방법을 배울 것입니다.
정규 표현식은 일반적으로 “ regex ” 또는 “ RegExp ”,은 특수한 형식의 텍스트 문자열로서 텍스트에서 패턴을 찾는 데 사용됩니다. 정규 표현식은 현재 사용 가능한 가장 강력한 도구 중 하나로서 텍스트를 효과적으로 처리하고 조작할 수 있습니다. 예를 들어, 사용자 입력 데이터 형식(예: 이름, 이메일, 전화번호 등)이 올바른지 확인하거나 텍스트 내에서 일치하는 문자열을 찾아내거나 대체하는 데 사용할 수 있습니다.
PHP(버전5.3및 이상 버전)는 preg_ 함수 시리즈를 통해 Perl 스타일 정규 표현식을 지원합니다. 왜 Perl 스타일 정규 표현식을 사용합니까? 왜냐하면 Perl(실용적인 추출 및 보고 언어는 정규 표현식에 통합적인 지원을 제공하는 주요 프로그래밍 언어 중 하나로, 정규 표현식에 대한 강력한 지원 및 독특한 텍스트 처리 및 조작 기능으로 유명합니다.
정규 표현식 세계에 더 깊이 탐구하기 전에, 일반적으로 사용되는 PHP 내장 패턴 매칭 기능을 간단히 소개합니다.
함수 | 설명 |
---|---|
preg_match() | 정규 표현식 매칭을 수행합니다. |
preg_match_all() | 전체 정규 표현식 매칭을 수행합니다. |
preg_replace() | 정규 표현식을 사용하여 검색 및 대체합니다. |
preg_grep() | 모델과 일치하는 입력 배열의 요소를 반환합니다. |
preg_split() | 정규 표현식을 사용하여 문자열을 서브 문자열로 분할합니다. |
preg_quote() | 문자열에서 찾은 정규 표현식 문자를 인용합니다. |
주의: PHP preg_match() 함수는 첫 번째 매칭이 발견되면 검색을 중지하고 preg_match_all() 함수는 문자열의 끝까지 검색하여 모든 가능한 매칭을 발견합니다. 그러나 preg_match() 함수는 첫 번째 매칭에서 멈춥니다.
정규 표현식 문법은 특수 문자의 사용을 포함합니다(예:HTML 특수 문자혼란). 정규 표현식에서 특별한 의미를 가진 문자는: . * ? + [ ] ( ) { } ^ $ | \]. 이 문자들이 실제 의미를 가지려면 반대사용 기호를 사용해야 합니다. 예를 들어, "."를 매칭하려면 \.을 써야 합니다. 모든 다른 문자는 자동으로 실제 의미를 가집니다.
다음 각 절은 패턴을 정의할 수 있는 여러 가지 옵션을 설명합니다:
문자 클래스는 문자 클래스로 부르며, 예를 들어 [ABC]와 같습니다. 문자 클래스는 항상 지정된 문자 목록 중 단일 문자를 매칭합니다. 따라서 [abc]는 a, b, c 문자만 매칭합니다.
도 거부된 문자 클래스를 정의할 수 있습니다. 거부된 문자 클래스는 왼쪽 괄호 뒤에 슬래시(^)를 사용하여 정의됩니다. 예를 들어, [^abc]와 같습니다.
문자 클래스(예:-)-내부에서 점(-)을 사용하여 문자 범위 [0-9]. 문자 클래스의 예제를 몇 가지 보겠습니다:
正则表达式 | 它能做什么 |
---|---|
[abc] | a, b, c 중 하나든 매칭합니다。 |
[^abc] | a, b, c를 제외한 어떤 문자든 매칭합니다。 |
[a-z] | 소문자 a에서 소문자 z까지의 어떤 문자든 매칭합니다。 |
[A-Z] | 대문자 A에서 대문자 Z까지의 어떤 문자든 매칭합니다。 |
[a-Z] | 소문자 a에서 대문자 Z까지의 어느 문자와 일치합니다. |
[0-9] | 0부터9간의 하나의 숫자와 일치합니다. |
[a-z0-9] | a와 z 사이 또는 0과9간의 단일 문자와 일치합니다. |
다음 예제에서는 정규 표현식과 PHP preg_match() 함수를 사용하여 문자열에 패턴이 있는지 확인하는 방법을 설명합니다:
<?php $pattern = '"/ca[kf]e/"; $text = "He was eating cake in the cafe."; if(preg_match($pattern, $text)){ echo "Match found!"; } else{ echo "Match not found."; } ?>테스트를 보세요‹/›
또한 preg_match_all() 함수를 사용하여 문자열에서 모든 일치 사항을 찾을 수 있습니다:
<?php $pattern = '"/ca[kf]e/"; $text = "He was eating cake in the cafe."; $matches = preg_match_all($pattern, $text, $array); echo $matches . ' matches were found.'; ?>테스트를 보세요‹/›
추천:정규 표현식은 PHP 전용이 아닙니다. Java, Perl, Python 등 다른 언어도 동일한 기호를 사용하여 텍스트 패턴을 찾습니다.
일부 문자 클래스(예: 숫자, 문자, 공백)는 자주 사용되므로 각각 단축 이름이 있습니다. 다음 표는 이러한 предопределенные 문자 클래스를 나열합니다:
가속기 | 它能做什么 |
---|---|
. | 개행 문자 \n을 제외한 모든 단일 문자와 일치합니다. |
\d | 모든 숫자 문자와 일치합니다. [0-9]와 같습니다. |
\D | 모든 비숫자 문자와 일치합니다. ^[0-9]와 같습니다. |
\s | 모든 공백 문자(공백, 탭, 개행 문자 또는 엔터 문자)와 일치합니다. [\t\n\r]와 같습니다. |
\S | 모든 비공백 문자와 일치합니다. ^[\t\n\r]와 같습니다. |
\w | 모든 단어 문자와 일치합니다. (정의된 것은 a부터 z, A부터 Z, 0부터9또는 밑줄과 일치합니다). [a-zA-Z_0-9]와 같습니다. |
\W | 모든 비단어 문자와 일치합니다. ^[a-Za-Z_0-9]와 같습니다. |
다음 예제에서는 정규 표현식과 PHP preg_replace() 함수를 사용하여 문자열에서 연결 문자를 사용하여 공백을 찾고 교체하는 방법을 설명합니다:
<?php $pattern = '"/\s/"; $replacement = ""-"; $text = "Earth revolves around\nthe\tSun"; //공백, 개행 문자 및 탭 문자를 교체 echo preg_replace($pattern, $replacement, $text); echo "<br>"; //공백만 교체 echo str_replace(" ", "",-"$text); ?>테스트를 보세요‹/›
이전 장에서는 단일 문자를 여러 가지 방법으로 일치시키는 방법을 배웠습니다. 그러나 여러 문자를 일치시키려고 할 때는 어떻게 해야 합니까? 예를 들어, 문자열이 p 문자를 하나 이상 포함하는 단어나 p 문자가 두 개 이상인 단어를 찾고 싶다면 어떻게 해야 합니까? 이것이 정규 표현식에서 퀴어넘버가 작용하는 곳입니다. 퀴어넘버를 사용하면 정규 표현식에서 문자가 어떤 횟수로 일치해야 하는지 지정할 수 있습니다.
다음 표는 특정 패턴을 양적으로 정의하는 여러 가지 방법을 나열했습니다:
正则表达式 | 它能做什么 |
---|---|
p+ | 匹配一个或多个字母p。 |
p* | 匹配零个或多个出现的字母p。 |
p? | 匹配零个或一个出现的字母p。 |
p{2} | 正好匹配两个字母p。 |
p{2,3} | 匹配至少两个出现的字母p,但不超过三个出现的字母p。 |
p{2,} | 匹配两次或超过2次出现的字母p。 |
p{3} | 最多匹配三个出现的字母p |
以下示例中的正则表达式将使用PHP preg_split()函数将字符串分割为逗号,逗号序列,空格或它们的组合:
<?php $pattern = '"/[\s,]+/"; $text = "My favourite colors are red, green and blue"; $parts = preg_split($pattern, $text); //循环遍历$parts数组并显示子字符串 foreach($parts as $part){ echo $part . "<br>"; } ?>테스트를 보세요‹/›
在某些情况下,您希望在行、词或字符串的开头或结尾进行匹配。要做到这一点,您可以使用锚点。两个常见的锚点是表示字符串开始的插入符号(^)和表示字符串结束的美元符号($)。
正则表达式 | 它能做什么 |
---|---|
^p | 与行首的字母p匹配。 |
p$ | 与行尾的字母p匹配。 |
以下示例中,正则表达式将仅使用PHP preg_grep()函数显示名称数组中以字母“J”开头的名称:
<?php $pattern = '"/^J/"; $names = array("Jhon Carter", "Clark Kent", "John Rambo"); $matches = preg_grep($pattern, $names); //遍历$matches数组并显示匹配的名称 foreach($matches as $match){ echo $match . "<br>"; } ?>테스트를 보세요‹/›
模式修饰符允许您指定模式匹配的处理方式。模式修饰符直接放置在正则表达式之后,例如,如果要以不区分大小写的方式搜索模式,则可以使用 i 修饰符,如下所示:/pattern/i。下表列出了一些最常用的模式修饰符。
修饰符 | 它能做什么 |
---|---|
i | 使匹配不区分大小写。 |
m | 更改^和$的行为以匹配换行符边界(即多行字符串中每行的开始或结束),而不是字符串边界。 |
g | 执行全局匹配,即找到所有匹配项。 |
o | 仅对表达式求值一次。 |
s | 所有字符的行为更改以匹配,包括换行符。(点) |
x | 정규 표현식에서 공백과 주석을 사용하여 명확성을 유지할 수 있습니다. |
다음 예제는 i 수정자와 PHP preg_match_all() 함수를 사용하여 대소문자를 구분하지 않는 전체 검색을 수행하는 방법을 보여줍니다.
<?php $pattern = '"/color/i"; $text = 'Color red is more visible than color blue in daylight.'; $matches = preg_match_all($pattern, $text, $array); echo $matches . ' matches were found.'; ?>테스트를 보세요‹/›
다음 예제는 PHP preg_match_all() 함수와 ^ 앵커 및 m 수정자를 사용하여 다중 행 문자열의 각 행의 시작에 일치시키는 방법을 보여줍니다.
<?php $pattern = '"/^color/im"; $text = 'Color red is more visible than \ncolor blue in daylight.'; $matches = preg_match_all($pattern, $text, $array); echo $matches . ' matches were found.'; ?>테스트를 보세요‹/›
단어 경계 문자(\b)는 모드로 시작하고 끝나는 단어를 검색하는 데 도움이 됩니다./로 끝나는 단어를 일치시킵니다. 예를 들어, 정규 표현식/\bcar/모드 'car'로 시작하는 단어를 일치시키며 'cart', 'carrot', 또는 'cartoon'을 일치시키지만 'oscar'는 일치시키지 않습니다.
마찬가지로 정규 표현식/car\b/모드 'car'로 끝나는 단어를 일치시키며 'scar', 'oscar', 또는 'supercar'를 일치시키지만 'cart'는 일치시키지 않습니다. 마찬가지로/\bcar\b/단어의 시작과 끝이 'car'로 시작하며 단어 'car'만 일치하는 단어를 일치시킵니다.
다음 예제는 'car'로 시작하는 단어를 강조하여 표시합니다:
<?php $pattern = '''/\bcar\w*/'; $replacement = '<b>$0</b>'; $text = 'car로 시작하는 단어: cart, carrot, cartoon. car로 끝나는 단어: scar, oscar, supercar.'; echo preg_replace($pattern, $replacement, $text); ?>테스트를 보세요‹/›
정규 표현식의 기본 지식을 알고 계신지 확인해 주세요. 퍼미션 양식 데이터를 정규 표현식으로 검증하는 방법을 알아보려면 관련PHP 퍼미션 양식의 튜토리얼.