다음은 PHP 정규식 preg_grep 학습을 용이하게 하기 위해 PHP에서 정규식에 대한 일반적인 함수 코드 모음입니다
.
(PHP4, PHP5)
preg_grep -- 패턴과 일치하는 배열 셀 설명을 반환합니다.
array preg_grep ( 문자열 패턴, 배열 입력 [, int 플래그] )
preg_grep() 입력 배열에서 주어진 패턴 패턴과 일치하는 셀이 포함된 배열을 반환합니다.
플래그는 다음 플래그일 수 있습니다:
PREG_GREP_INVERT
이 플래그를 전달하면 preg_grep()은 주어진 패턴과 일치하지 않는 입력 배열의 셀을 반환합니다. 이 태그는 PHP 4.2.0부터 사용할 수 있습니다.
PHP 4.0.4부터 preg_grep()에 의해 반환된 결과는 입력 배열의 키를 사용하여 색인화됩니다. 이러한 결과를 원하지 않으면 array_values()를 사용하여 preg_grep()에서 반환된 결과를 다시 색인화하세요.
위는 매뉴얼의 preg_grep()에 대한 설명입니다. 우선 이것은 perl 호환 정규 함수이므로 preg_grep은 p(perl)reg(regular)_grep을 의미하는 것으로 추측됩니다. 자체 확장을 통해 배열에 사용할 수 있다는 것이 특징입니다. 다차원 배열에서 일치하며 플래그 매개변수를 통해 일치하거나 일치하지 않는 배열을 반환할 수 있습니다. foreach(...){if...} 구조(검증되지 않음)를 사용하는 것보다 효율성이 훨씬 빠르며 복잡한 패턴과 일치할 수 있습니다. 검색 및 정렬과 같은 응용 프로그램에서 매우 유용합니다.
예:
<?
$arr = array('abc'=>12.213,'bb'=>12345,'ba'=>23.2321,34.3,'23'=>'3.3','23434'=>'bbb');
// 부동 소수점 숫자를 포함하는 모든 배열 요소를 반환합니다.
$fl_array = preg_grep ("/^(d+)?.d+$/", $arr);
print_r($fl_array);
?>
preg_match
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_match -- 정규식 일치 지침
int preg_match (문자열 패턴, 문자열 주제 [, 배열 일치 [, int 플래그]] )는
주제 문자열에서 패턴에 지정된 정규식과 일치하는 콘텐츠를 검색합니다.
일치하는 항목이 제공되면 검색 결과로 채워집니다. $matches[0]에는 전체 패턴과 일치하는 텍스트가 포함되고, $matches[1]에는 괄호 안의 첫 번째 캡처된 하위 패턴과 일치하는 텍스트가 포함됩니다.
플래그는 다음 플래그일 수 있습니다:
PREG_OFFSET_CAPTURE
이 플래그가 설정되면 일치 항목이 발생할 때마다 관련 문자열 오프셋도 반환됩니다. 이는 반환된 배열의 값을 변경하여 배열의 각 셀도 배열이 되도록 합니다. 여기서 첫 번째 항목은 일치하는 문자열이고 두 번째 항목은 해당 오프셋입니다. 이 태그는 PHP 4.3.0부터 사용할 수 있습니다.
flags 매개변수는 PHP 4.3.0부터 사용할 수 있습니다.
preg_match()는 패턴이 일치하는 횟수를 반환합니다. preg_match()가 첫 번째 일치 이후 검색을 중지하므로 0회(일치 없음) 또는 1회입니다. 반대로 preg_match_all()은 제목 끝까지 검색합니다. 오류가 발생하면 preg_match()는 FALSE를 반환합니다.
팁: 한 문자열이 다른 문자열 내에 포함되어 있는지 확인하려면 preg_match()를 사용하지 마세요. 대신 strpos() 또는 strstr()을 사용할 수 있으며 이는 훨씬 빠릅니다.
위는 매뉴얼에 있는 preg_match()에 대한 설명입니다. 이 함수의 기능은 특정 문자열이 특정 요구 사항을 충족하는지 확인하는 데 사용할 수 있다는 것입니다. 제한 사항은 위에서 언급한 대로 0회 또는 1회 일치한다는 것입니다. 그리고 반환 값은 일치 항목 수입니다. 전체 일치가 필요한 경우 preg_match_all()을 사용할 수 있으며, 자체 패턴의 반환 값으로 사용할 수 있는 $matches 배열의 역할도 언급할 가치가 있으며 이는 때때로 유용합니다.
예:
<?
if (preg_match ("/(bwebb)s(d)/i", "PHP는 선택한 웹 스크립팅 웹 34 언어입니다.",$match)) {
"일치하는 항목을 찾았습니다."를 인쇄합니다.
print_r($match);
} 또 다른 {
"일치하는 항목을 찾을 수 없습니다."를 인쇄합니다.
}
?>
<?php
// URL에서 호스트 이름을 가져옵니다.
preg_match("/^(http://)?([^/]+)/i",
" http://www.php.net/index.html ", $matches);
$host = $matches[2];
// 호스트 이름에서 다음 두 세그먼트를 가져옵니다.
preg_match("/[^./]+.[^./]+$/", $host, $matches);
echo "도메인 이름: {$matches[0]}n";
?>
preg_match_all
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_match_all -- 전역 정규식 일치를 수행합니다. 매뉴얼에 이 함수에 대한 설명이 매우 명확하므로 더 이상 설명하지 않겠습니다.
설명하다
int preg_match_all (문자열 패턴, 문자열 주제, 배열 일치 [, int 플래그])는
패턴에 지정된 정규식과 일치하는 주제의 모든 콘텐츠를 검색하고 그 결과를 플래그에 지정된 순서대로 일치 항목에 넣습니다.
첫 번째 일치 항목을 찾은 후 이전 일치 항목이 끝날 때 후속 검색이 시작됩니다.
플래그는 다음 플래그의 조합일 수 있습니다(PREG_PATTERN_ORDER와 PREG_SET_ORDER를 함께 사용하는 것은 의미가 없음):
PREG_PATTERN_ORDER
$matches[0]가 모든 패턴 일치의 배열이고 $matches[1]가 첫 번째 대괄호의 하위 패턴과 일치하는 문자열 배열이 되도록 결과를 정렬합니다.
<?php
preg_match_all ("|<[^>]+>(.*)</[^>]+>|U", "<b>예: </b><div align=left>이것은 테스트입니다</div >",
$out, PREG_PATTERN_ORDER);
$out[0][0].", ".$out[0][1]."n"을 인쇄합니다.
$out[1][0].", ".$out[1][1]."n"을 인쇄합니다.
?>
이 예는 다음과 같이 출력됩니다:
<b>예: </b>, <div align=left>이것은 테스트입니다</div>
예: , 이것은 테스트입니다
. 따라서 $out[0]에는 전체 패턴과 일치하는 문자열이 포함되고 $out[1]에는 HTML 태그 쌍 사이의 문자열이 포함됩니다.
PREG_SET_ORDER
$matches[0]가 첫 번째 일치 집합의 배열이고, $matches[1]이 두 번째 일치 집합의 배열이 되도록 결과를 정렬합니다.
<?php
preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",
"<b>예: </b><div align=left>테스트입니다</div>",
$out, PREG_SET_ORDER);
$out[0][0].", ".$out[0][1]."n"을 인쇄합니다.
$out[1][0].", ".$out[1][1]."n"을 인쇄합니다.
?>
이 예제는 다음을 출력합니다:
<b>예: </b>, 예:
<div align=left>이것은 테스트입니다</div>, 이것은 테스트입니다
이 예에서 $matches[0]는 첫 번째 일치 결과 집합이고, $matches[0][0]에는 전체 패턴과 일치하는 텍스트가 포함되고, $matches[0][1]에는 첫 번째 하위 패턴과 일치하는 텍스트가 포함됩니다. , 등등으로 끝납니다. 마찬가지로, $matches[1]은 두 번째 일치 항목 집합입니다.
PREG_OFFSET_CAPTURE
이 플래그가 설정되면 일치 항목이 발생할 때마다 관련 문자열 오프셋도 반환됩니다. 이는 반환된 배열의 값을 변경하여 각 셀도 배열이 되도록 변경합니다. 여기서 첫 번째 항목은 일치하는 문자열이고 두 번째 항목은 주제 내의 오프셋입니다. 이 태그는 PHP 4.3.0부터 사용할 수 있습니다.
태그가 지정되지 않으면 PREG_PATTERN_ORDER가 가정됩니다.
전체 패턴이 일치한 횟수(0일 수도 있음)를 반환하거나, 오류가 있는 경우 FALSE를 반환합니다.
예 1. 문자 메시지에서 모든 전화번호 가져오기
<?php
preg_match_all ("/(? (d{3})? )? (?(1) [-s] ) d{3}-d{4}/x",
"555-1212 또는 1-800-555-1212로 전화하세요", $phones);
?>
예 2. 일치하는 HTML 태그 검색(탐욕)
<?php
// \2는 역참조의 예이며, PCRE에서의 의미는 다음과 같습니다.
// 정규식 자체의 두 번째 대괄호 세트 내의 내용과 일치해야 합니다. 이 경우
// ([w]+)입니다. 문자열이 큰따옴표로 묶여 있으므로 다음이 필요합니다.
//백슬래시를 추가합니다.
$html = "<b>굵은 글씨</b><a href=howdy.html>나를 클릭하세요</a>";
preg_match_all ("/(<([w]+)[^>]*>)(.*)(</\2>)/", $html, $matches);
for ($i=0; $i< count($matches[0]); $i++) {
echo "일치됨: ".$matches[0][$i]."n";
echo "1부: ".$matches[1][$i]."n";
echo "2부: ".$matches[3][$i]."n";
echo "3부: ".$matches[4][$i]."nn";
}
?>
preg_quote
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_quote -- 정규식 문자 설명을 이스케이프합니다.
string preg_quote ( string str [, string delimiter] )
preg_quote()는 str을 매개변수로 사용하고 정규식 구문에 속하는 각 문자 앞에 백슬래시를 추가합니다. 동적으로 생성된 문자열을 패턴으로 일치시켜야 하는 경우 이 함수를 사용하여 문자열에 포함될 수 있는 특수 문자를 이스케이프할 수 있습니다.
선택적 인수 구분 기호가 제공되면 이 문자도 이스케이프됩니다. PCRE 함수에 필요한 구분 기호를 이스케이프하는 데 사용할 수 있습니다. 가장 일반적으로 사용되는 구분 기호는 슬래시 /입니다.
정규 표현식의 특수 문자는 다음과 같습니다: . + * ? [ ^ ] $ ( ) { } = !
참고: 이 함수는 바이너리 개체에 사용해도 안전합니다.
위 내용은 매뉴얼에 설명이 너무 명확해서 자세히 설명하지 않겠습니다. 또한, 이 기능은 바이너리 객체에 안전하게 사용할 수 있다는 메모가 매뉴얼에 나와 있어 매우 유용합니다.
예: 예 1. preg_quote() 예
<?php
$keywords = 'g3/400에 $40';
$keywords = preg_quote($keywords, '/');
echo $keywords; // g3의 경우 $40/400을 반환합니다.
?>
예 2. 텍스트의 단어에 이탤릭체 추가
<?php
// 이 예에서는 preg_quote($word)를 사용하여 정규식에서 별표를 제외했습니다.
// 특별한 의미가 있습니다.
$textbody = "이 책은 찾기가 *매우* 어렵습니다.";
$word = "*매우*";
$textbody = preg_replace ("/".preg_quote($word)."/",
"<i>".$word."</i>",
$텍스트바디);
?>
다음 단계는 매우 유연하고 강력하며 널리 사용되는 preg_replace 기능을 적용하는 것입니다.
preg_replace
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_replace – 정규식 검색 및 바꾸기 명령을 수행합니다.
혼합 preg_replace(혼합 패턴, 혼합 교체, 혼합 주제 [, int 제한])는
주제에서 패턴 패턴과 일치하는 항목을 검색하고 이를 교체로 바꿉니다. 한계가 지정되면 한계 일치만 대체됩니다. 한계가 생략되거나 값이 -1인 경우 모든 일치가 대체됩니다.
교체에는 \n 형식 또는 (PHP 4.0.4부터) $n 형식의 역참조가 포함될 수 있으며 후자가 선호됩니다. 이러한 각 참조는 캡처된 n번째 대괄호 하위 패턴과 일치하는 텍스트로 대체됩니다. n의 범위는 0부터 99까지이며, 여기서 \0 또는 $0은 전체 패턴과 일치하는 텍스트를 나타냅니다. 왼쪽 괄호를 왼쪽에서 오른쪽(1부터 시작)으로 세어 하위 패턴의 수를 구합니다.
숫자에 의한 역참조 뒤에 오는 대체 패턴(즉, 일치하는 패턴 바로 뒤에 오는 숫자)의 경우 익숙한 \1 표기법을 사용하여 역참조를 나타낼 수 없습니다. 예를 들어, \11은 preg_replace()가 \1 뒤에 숫자 1이 오는 역참조를 원하는지 아니면 \11 의 역참조를 원하는지 혼란스럽게 만듭니다. 이 경우 해결책은 ${1}1을 사용하는 것입니다. 이렇게 하면 $1에 대한 격리된 역참조가 생성되고 나머지 1은 리터럴로 남습니다.
일치하는 항목이 있으면 대체된 제목이 반환되고, 그렇지 않으면 원래 제목이 반환됩니다.
preg_replace()의 각 매개변수(제한 제외)는 배열이 될 수 있습니다. 패턴과 교체가 모두 배열인 경우 키가 배열에 나타나는 순서대로 처리됩니다. 이는 인덱스의 숫자 순서와 반드시 동일할 필요는 없습니다. 어떤 패턴이 어떤 교체로 대체되는지 식별하기 위해 인덱스가 사용되는 경우 preg_replace()를 호출하기 전에 배열을 ksort()로 정렬해야 합니다.
제목이 배열인 경우 제목의 각 항목에 대해 검색 및 바꾸기가 수행되고 배열이 반환됩니다.
패턴과 교체가 모두 배열인 경우 preg_replace()는 주제를 검색하고 바꾸기 위해 해당 값을 꺼냅니다. 패턴보다 대체할 값이 적을 경우 나머지 대체값으로 빈 문자열을 사용합니다. 패턴이 배열이고 교체가 문자열인 경우 이 문자열은 패턴의 각 값에 대한 대체 값으로 사용됩니다. 그 반대는 의미가 없습니다.
/e 수정자는 preg_replace()가 대체 인수를 PHP 코드로 처리하도록 합니다(적절한 역참조가 대체된 후). 팁: 교체가 유효한 PHP 코드 문자열을 형성하는지 확인하십시오. 그렇지 않으면 PHP는 preg_replace()가 포함된 행에서 구문 분석 오류를 보고합니다.
참고: PHP 4.0.1pl2 이후에 한계 매개변수가 추가되었습니다.
문자열뿐만 아니라 배열도 처리할 수 있고, 역참조 기능이 매우 유연하다는 점이 강점이라고 생각합니다. 기본적으로 일반 사용자의 요구 사항 대부분을 충족할 수 있지만, 능숙하지 않은 경우 고급 요구 사항에 맞게 콜백 기능을 사용자 정의할 수 있는 preg_replace_callback() 함수도 있습니다. 필터 설계 등
preg_replace_callback
(PHP 4 >= 4.0.5, PHP 5)
preg_replace_callback -- 콜백 함수를 사용하여 정규식 검색 및 바꾸기 명령을 수행합니다.
혼합 preg_replace_callback (혼합 패턴, 콜백 콜백, 혼합 주제 [, int 제한])
이 함수는 대체 매개변수를 제공하는 대신 콜백 함수가 지정된다는 점을 제외하면 preg_replace()와 거의 유사하게 작동합니다. 이 함수는 대상 문자열에서 일치하는 배열을 입력으로 사용하고 대체에 사용되는 문자열을 반환합니다.
예시 1. preg_replace_callback() 예시
<?php
// 이 텍스트는 2002년에 대한 것입니다.
// 이제 2003년에 사용할 수 있게 만들고 싶습니다.
$text = "만우절은 2002년 4월 1일입니다n";
$text.= "지난 크리스마스는 2001년 12월 24일n";
// 콜백 함수
함수 next_year($matches) {
// 일반적으로: $matches[0]은 완전한 일치입니다.
// $matches[1]은 첫 번째 대괄호의 하위 패턴과 일치합니다.
// 등등
$matches[1].($matches[2]+1)을 반환합니다.
}
에코 preg_replace_callback(
"|(d{2}/d{2}/)(d{4})|",
"내년",
$텍스트);
//결과는 다음과 같습니다.
// 만우절은 2003년 4월 1일입니다.
// 지난 크리스마스는 2002년 12월 24일이었습니다.
?>
preg_replace_callback()에 대한 콜백 함수가 한 곳에서만 필요한 경우가 많습니다. 이 경우 create_function()을 사용하여 preg_replace_callback() 호출 내에서 콜백으로 익명 함수를 선언할 수 있습니다. 호출에 대한 모든 정보를 한 곳에 보관하고 다른 곳에서는 사용되지 않는 콜백 함수 이름으로 함수 네임스페이스를 복잡하게 만들지 마세요.
preg_replace_callback() 함수를 사용하는 친구들이라면 아마도 콜백 함수가 필요할 텐데(그렇지 않으면 왜 사용하지? preg_replace를 직접 사용하는 것이 낫지 않나?) 한 곳에서만 사용하는 경우가 많다. 이 경우 create_function()을 사용하여 익명 함수를 preg_replace_callback()의 콜백 함수로 선언할 수 있습니다. 이런 방식으로 다시 사용되지 않는 함수 이름으로 인해 혼동되지 않고 정보를 선언해야 하는 필요성을 충족합니다.
예제 2. preg_replace_callback() 및 create_function()
<?php
/* 각 단락의 시작 부분에 있는 문자열을 제거하는 UNIX 스타일 명령줄 필터
*대문자를 소문자로 변환*/
$fp = fopen("php://stdin", "r") or die("표준 입력을 읽을 수 없습니다.");
동안 (!feof($fp)) {
$라인 = fgets($fp);
$line = preg_replace_callback(
'|<p>s*w|',
create_function(
// 여기서는 작은따옴표를 사용하는 것이 중요합니다.
// 그렇지 않으면 모든 $를 $로 바꿉니다.
'$ 일치',
'return strtolower($matches[0]);'
),
$line
);
에코 $line;
}
fclose($fp);
?>
드디어
preg_split
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_split – 정규식을 사용하여 문자열을 분할합니다. 여기서는 자세히 설명하지 않겠습니다.
설명하다
array preg_split ( 문자열 패턴, 문자열 주제 [, int 제한 [, int 플래그]] ) )는
패턴과 일치하는 경계를 따라 분할된 주제의 하위 문자열을 포함하는 배열을 반환합니다.
한계가 지정되면 최대 한계 하위 문자열이 반환됩니다. 한계가 -1이면 한계가 없으며 선택적 매개변수 플래그를 계속 지정하는 데 사용할 수 있음을 의미합니다.
플래그는 다음 플래그의 조합일 수 있습니다(비트 OR 연산자 | 와 결합):
PREG_SPLIT_NO_EMPTY
이 플래그가 설정되면 preg_split()은 비어 있지 않은 구성 요소만 반환합니다.
PREG_SPLIT_DELIM_CAPTURE
이 플래그가 설정되면 구분 기호 패턴의 대괄호 표현식도 캡처되어 반환됩니다. 이 태그는 PHP 4.0.5에서 추가되었습니다.
PREG_SPLIT_OFFSET_CAPTURE
이 플래그가 설정되면 일치하는 결과가 발생할 때마다 관련 문자열 오프셋도 반환됩니다. 이는 반환된 배열의 값을 변경하여 각 셀도 배열이 되도록 변경합니다. 여기서 첫 번째 항목은 일치하는 문자열이고 두 번째 항목은 주제 내의 오프셋입니다. 이 태그는 PHP 4.3.0부터 사용할 수 있습니다.
팁: 정규식의 강력한 기능이 필요하지 않은 경우,exploise() 또는 str_split()과 같은 더 빠르고 간단한 대안을 사용하도록 선택할 수 있습니다.