>  기사  >  백엔드 개발  >  PHP 일반 교체 함수 preg_replace 및 preg_replace_callback_php 팁 사용 요약

PHP 일반 교체 함수 preg_replace 및 preg_replace_callback_php 팁 사용 요약

WBOY
WBOY원래의
2016-05-16 20:35:531218검색

PHP 템플릿 엔진 도구 클래스를 작성할 때 일반적으로 사용되는 일반 대체 함수는 preg_replace()입니다. 일반 수식자 /e를 사용하면 강력한 콜백 함수를 실행하고 템플릿 엔진 컴파일(실제로는 문자열 대체)을 실현할 수 있습니다.

자세한 내용은 블로그 게시물을 참조하세요. PHP 함수 preg_replace()는 조건에 맞는 모든 문자열을 정기적으로 교체합니다

적용사례는 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.

/**
* 템플릿 파싱 클래스
​*/
클래스 템플릿 {

공개 함수 컴파일($template) {

// 논리라면
$template = preg_replace("//e", "$this->ifTag('\1')", $template);

$template 반환;
}

/**
* 태그
​*/
보호된 함수 ifTag($str) {

//$str = Stripslashes($str) // 이스케이프 해제

return '';
}
}

$template = 'xxxyyyzzz';

$tplComplier = 새 템플릿();

$template = $tplComplier->컴파일($template);

에코 $템플릿;

?>

출력 결과는 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.

xxxyyyzzz

자세히 살펴보고 $user["password"]의 큰따옴표가 이스케이프되어 있음을 확인하세요. 이는 우리가 원하는 결과가 아닙니다.

정상적으로 출력하려면 이스케이프를 해제해야 합니다. 그러나 문자열 자체에 이스케이프 큰따옴표가 포함되어 있으면 이때 이스케이프를 해제하게 되며, 원래의 이스케이프는 non-escaping이 됩니다. 우리가 원하기 때문에 이 기능은 그런 점에서 사용하기 불편합니다!

나중에 좀 더 전문적인 정규 교체 콜백 함수인 preg_replace_callback()을 발견했습니다.

코드 복사 코드는 다음과 같습니다.

혼합 preg_replace_callback( 혼합 패턴, 콜백 콜백, 혼합 주제 [, int 제한] )
이 함수는 대체 매개변수를 제공하는 대신 콜백 함수가 지정된다는 점을 제외하면 preg_replace()와 거의 유사하게 작동합니다. 이 함수는 대상 문자열에서 일치하는 배열을 입력으로 사용하고 대체에 사용되는 문자열을 반환합니다.

콜백 함수 콜백:

교체가 필요할 때마다 호출되는 콜백 함수입니다. 호출 시 함수에서 얻은 매개변수는 주제와 일치하는 결과입니다. 콜백 함수는 실제로 대체에 참여하는 문자열을 반환합니다. 콜백 함수의 서명은 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.

문자열 처리기(배열 $matches)

위에서 볼 수 있듯이 콜백 함수에는 일반적으로 배열 유형인 하나의 매개변수만 있습니다.

preg_replace_callback() 함수의 몇 가지 예를 나열하세요.

예제 #1 preg_replace_callback() 및 익명 함수

코드 복사 코드는 다음과 같습니다.

/* 단락 시작 부분의 대문자를 소문자로 변환하는 유닉스 스타일 명령줄 필터입니다. */
$fp = fopen("php://stdin", "r") 또는 die("표준 입력을 읽을 수 없습니다");
동안 (!feof($fp)) {
$line = fgets($fp);
$line = preg_replace_callback(
          '|

s*w|',
함수($matches) {
               return strtolower($matches[0]);
},
         $라인
);
에코 $line;
}
fclose($fp);
?>

콜백 함수가 익명 함수인 경우 PHP5.3에서는 키워드 사용을 통해 아래와 같이 여러 매개변수를 익명 함수에 전달할 수 있습니다.

코드 복사 코드는 다음과 같습니다.

$string = "일부 숫자: 1: 1; 2: 2; 3: 3 끝"; $10 = 10
$newstring = preg_replace_callback(
'/(\d )/',
함수($match) 사용 ($ten) { return (($match[0] $ten)),
$문자열
);
$newstring을 에코
#prints "일부 숫자: 1: 11, 2: 12, 3: 13 end"; ?>


예제 #2 preg_replace_callback() 및 일반 함수

//텍스트의 연도에 1년을 추가합니다.
$text = "만우절은 2002년 4월 1일입니다.";
$text.= "지난 크리스마스는 2001년 12월 24일이었습니다.";
//콜백 함수
함수 next_year($matches) {
// 일반적으로: $matches[0]은 완료된 일치입니다
// $matches[1]은 첫 번째 캡처 하위 그룹과 일치합니다
// 등등
$matches[1]를 반환합니다.($matches[2] 1);
}
echo preg_replace_callback(
"|(d{2}/d{2}/)(d{4})|",
“내년_년”,
               $text);

?>


예제 #3 preg_replace_callback() 및 클래스 메서드

클래스 내에서 비정적 함수를 호출하는 방법은 무엇입니까? 다음과 같이 할 수 있습니다:

PHP 5.2의 경우 두 번째 매개변수는 다음과 같이 array($this, 'replace')입니다.



클래스 test_preg_callback{

비공개 함수 처리($text){

$reg = "/{([0-9a-zA-Z- ] ):([0-9a-zA-Z- ] ):?}/";

return preg_replace_callback($reg, array($this, 'replace'), $text);
}

개인 함수 대체($matches){
If (method_exists($this, $matches[1])){
@$this->$matches[1]($matches[2])를 반환합니다.
}
}  
}
?>


PHP5.3의 경우 두 번째 매개변수는 다음과 같이 "self::replace"입니다. 이것은 array($this, 'replace')일 수도 있습니다.



클래스 test_preg_callback{

비공개 함수 처리($text){

$reg = "/{([0-9a-zA-Z- ] ):([0-9a-zA-Z- ] ):?}/";

return preg_replace_callback($reg, "self::replace", $text);
}

개인 함수 대체($matches){
If (method_exists($this, $matches[1])){
@$this->$matches[1]($matches[2])를 반환합니다.
}
}  
}
?>


위에서 배운 지식 포인트를 바탕으로 템플릿 엔진 클래스는 다음과 같이 변형됩니다.


코드 복사 코드는 다음과 같습니다.

/**
* 템플릿 파싱 클래스
​*/
클래스 템플릿 {

공개 함수 컴파일($template) {

// 논리라면
$template = preg_replace_callback("//", array($this, 'ifTag'), $template);

$template 반환;
}

/**
* 태그
​*/
보호된 함수 ifTag($matches) {
return '';
}
}

$template = 'xxxyyyzzz';

$tplComplier = 새 템플릿();

$template = $tplComplier->컴파일($template);

에코 $템플릿;

?>

출력 결과는 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.

xxxyyyzzz

정확히 우리가 원하는 것은 큰따옴표가 이스케이프되지 않는다는 것입니다!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.