PHP
정규식 (regexp / PCRE)
수색…
통사론
-
preg_replace($pattern, $replacement, $subject, $limit = -1, $count = 0);
-
preg_replace_callback($pattern, $callback, $subject, $limit = -1, $count = 0);
-
preg_match($pattern, $subject, &$matches, $flags = 0, $offset = 0);
-
preg_match_all($pattern, $subject, &$matches, $flags = PREG_PATTERN_ORDER, $offset = 0);
-
preg_split($pattern, $subject, $limit = -1, $flags = 0)
매개 변수
매개 변수 | 세부 |
---|---|
$pattern | 정규 표현을 포함한 캐릭터 라인 (PCRE 패턴) |
비고
PHP 정규식은 Perl 정규 표현식에서 파생 된 PCRE 패턴 표준을 따릅니다.
PHP의 모든 PCRE 문자열은 구분 기호로 묶어야합니다. 구분 기호는 영숫자가 아니며 백 슬래시가 아닌 공백이 아닌 문자가 될 수 있습니다. 인기있는 구분 기호는 ~
, /
, %
입니다.
PCRE 패턴은 그룹, 문자 클래스, 문자 그룹, 미리보기 / 뒤 비어 어설 션 및 이스케이프 된 문자를 포함 할 수 있습니다.
$pattern
문자열에 PCRE 수정자를 사용할 수 있습니다. 일반적인 것들은 i
(대소 문자 구별 없음), m
(다중 행) 및 s
(점 메타 문자에는 개행 문자가 포함됨)입니다. g
(전역) 수정자는 허용되지 않으므로 대신 preg_match_all
함수를 사용합니다.
PCRE 문자열에 대한 일치는 $
접두 번호가 매겨진 문자열로 수행됩니다.
<?php
$replaced = preg_replace('%hello ([a-z]+) world%', 'goodbye $1 world', 'hello awesome world');
echo $replaced; // 'goodbye awesome world'
정규 표현식과 일치하는 문자열
preg_match
는 문자열이 정규식과 일치하는지 검사합니다.
$string = 'This is a string which contains numbers: 12345';
$isMatched = preg_match('%^[a-zA-Z]+: [0-9]+$%', $string);
var_dump($isMatched); // bool(true)
세 번째 매개 변수를 전달하면 정규 표현식의 일치하는 데이터로 채워집니다.
preg_match('%^([a-zA-Z]+): ([0-9]+)$%', 'This is a string which contains numbers: 12345', $matches);
// $matches now contains results of the regular expression matches in an array.
echo json_encode($matches); // ["numbers: 12345", "numbers", "12345"]
$matches
에는 괄호로 묶인 정규 표현식의 부분 일치 문자열 전체가 포함 된 배열이 여는 괄호의 오프셋 순서대로 포함됩니다. 즉, /z(a(b))/
를 정규 표현식으로 사용하면 인덱스 0에는 전체 하위 문자열 zab
되고 인덱스 1에는 바깥 괄호 ab
묶인 하위 문자열이 포함되고 인덱스 2에는 안 괄호 b
가 포함됩니다.
문자열을 정규식으로 배열로 나눕니다.
$string = "0| PHP 1| CSS 2| HTML 3| AJAX 4| JSON";
//[0-9]: Any single character in the range 0 to 9
// + : One or more of 0 to 9
$array = preg_split("/[0-9]+\|/", $string, -1, PREG_SPLIT_NO_EMPTY);
//Or
// [] : Character class
// \d : Any digit
// + : One or more of Any digit
$array = preg_split("/[\d]+\|/", $string, -1, PREG_SPLIT_NO_EMPTY);
산출:
Array
(
[0] => PHP
[1] => CSS
[2] => HTML
[3] => AJAX
[4] => JSON
)
문자열을 배열로 분할하려면 문자열과 preg_split();
대한 preg_split();
표현식을 전달하기 만하면됩니다 preg_split();
검색 및 일치 시키려면 세 번째 매개 변수 ( limit
)를 추가하면 수행 할 "일치"횟수를 설정할 수 있으며 나머지 문자열은 배열의 끝에 추가됩니다.
네 번째 매개 변수는 ( flags
) 여기서 우리는 PREG_SPLIT_NO_EMPTY
를 사용하여 배열에 빈 키 / 값이 포함되지 않도록합니다.
정규 표현으로 대체 된 문자열
$string = "a;b;c\nd;e;f";
// $1, $2 and $3 represent the first, second and third capturing groups
echo preg_replace("(^([^;]+);([^;]+);([^;]+)$)m", "$3;$2;$1", $string);
출력
c;b;a
f;e;d
세미콜론 사이의 모든 것을 검색하고 순서를 반대로합니다.
글로벌 RegExp 일치
preg_match_all
사용하여 전역 RegExp 일치를 수행 할 수 있습니다. preg_match_all
은 subject 문자열에서 일치하는 모든 결과를 반환합니다 (첫 번째 결과 만 반환하는 preg_match
와는 대조적 임).
preg_match_all
함수는 일치하는 수를 반환합니다. 세 번째 매개 변수 $matches
는 네 번째 매개 변수에서 제공 할 수있는 플래그로 제어되는 형식의 $matches
를 포함합니다.
배열을 지정하면 $matches
는 preg_match
와 비슷한 형식의 배열을 포함합니다. 단, preg_match
는 첫 번째 일치에서 중지됩니다. preg_match_all
은 문자열이 전체적으로 소비 될 때까지 문자열을 반복하고 다차원 배열의 각 반복 결과를 반환합니다. 이 형식은 네 번째 인수에서 플래그로 제어 할 수 있습니다.
네 번째 인수 인 $flags
는 $matches
배열의 구조를 제어합니다. 기본 모드는 PREG_PATTERN_ORDER
이며 가능한 플래그는 PREG_SET_ORDER
및 PREG_PATTERN_ORDER
입니다.
다음 코드는 preg_match_all
사용법을 보여줍니다.
$subject = "a1b c2d3e f4g";
$pattern = '/[a-z]([0-9])[a-z]/';
var_dump(preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER)); // int(3)
var_dump($matches);
preg_match_all($pattern, $subject, $matches); // the flag is PREG_PATTERN_ORDER by default
var_dump($matches);
// And for reference, same regexp run through preg_match()
preg_match($pattern, $subject, $matches);
var_dump($matches);
PREG_SET_ORDER
의 첫 번째 var_dump는이 결과를 제공합니다.
array(3) {
[0]=>
array(2) {
[0]=>
string(3) "a1b"
[1]=>
string(1) "1"
}
[1]=>
array(2) {
[0]=>
string(3) "c2d"
[1]=>
string(1) "2"
}
[2]=>
array(2) {
[0]=>
string(3) "f4g"
[1]=>
string(1) "4"
}
}
$matches
에는 3 개의 중첩 배열이 있습니다. 각 배열은 하나의 일치를 나타내며 preg_match
의 반환 결과와 동일한 형식을 갖습니다.
두 번째 var_dump ( PREG_PATTERN_ORDER
)는 다음과 같이 출력합니다 :
array(2) {
[0]=>
array(3) {
[0]=>
string(3) "a1b"
[1]=>
string(3) "c2d"
[2]=>
string(3) "f4g"
}
[1]=>
array(3) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "4"
}
}
preg_match
통해 동일한 regexp를 실행하면 array가 반환됩니다.
array(2) {
[0] =>
string(3) "a1b"
[1] =>
string(1) "1"
}
콜백으로 문자열 바꾸기
preg_replace_callback
은 일치하는 모든 캡처 링 그룹을 정의 된 콜백에 보내고 콜백의 반환 값으로 대체합니다. 이것은 우리가 어떤 종류의 논리에 기반한 문자열을 대체 할 수있게합니다.
$subject = "He said 123abc, I said 456efg, then she said 789hij";
$regex = "/\b(\d+)\w+/";
// This function replaces the matched entries conditionally
// depending upon the first character of the capturing group
function regex_replace($matches){
switch($matches[1][0]){
case '7':
$replacement = "<b>{$matches[0]}</b>";
break;
default:
$replacement = "<i>{$matches[0]}</i>";
}
return $replacement;
}
$replaced_str = preg_replace_callback($regex, "regex_replace", $subject);
print_r($replaced_str);
# He said <i>123abc</i>, I said <i>456efg</i>, then she said <b>789hij</b>