English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

PHP 기본 튜토리얼

PHP 고급 튜토리얼

PHP & MySQL

PHP 참조 매뉴얼

PHP 정규 표현식

이 튜토리얼에서는 정규 표현식의 작동 방식과 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 퍼미션 양식의 튜토리얼.