수색…


통사론

  • 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 를 포함합니다.

배열을 지정하면 $matchespreg_match 와 비슷한 형식의 배열을 포함합니다. 단, preg_match 는 첫 번째 일치에서 중지됩니다. preg_match_all 은 문자열이 전체적으로 소비 될 때까지 문자열을 반복하고 다차원 배열의 각 반복 결과를 반환합니다. 이 형식은 네 번째 인수에서 플래그로 제어 할 수 있습니다.

네 번째 인수 인 $flags$matches 배열의 구조를 제어합니다. 기본 모드는 PREG_PATTERN_ORDER 이며 가능한 플래그는 PREG_SET_ORDERPREG_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> 


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow