> 백엔드 개발 > PHP 튜토리얼 > PHP 정규식 - 똑똑한 모방

PHP 정규식 - 똑똑한 모방

WBOY
풀어 주다: 2016-08-08 09:22:07
원래의
1260명이 탐색했습니다.
/**
클래스명 Smarty는 커스텀 템플릿 엔진입니다
이 클래스 객체를 통해 템플릿 파일을 로딩하고 파싱하고, 파싱된 결과를 출력합니다
*/
class Smarty {
public $template_dir = 'templates' //정의 템플릿 파일이 저장되는 디렉터리
public $compile_dir = 'templates_c'; //템플릿 엔진에 의해 파일이 결합된 후 저장되는 디렉터리를 정의합니다.
public $ left_delimiter = '<{ 🎜>
private $tpl_vars = array();                                                                    ’ s ‐       ‐ ‐ ‐ ‐ ​ ​ ​ ​ ​ ​  🎜>함수 할당($ tpl_var, $value = null) {
if ($tpl_var != '')                                                                               ] = $값;
}

                                                                                                                                                    >/* 지정된 디렉터리에서 템플릿 파일을 검색합니다*/
$tplFile = $this->template_dir.'/'.$fileName; 죽어(" 템플릿 파일 {$tplFile}이 존재하지 않습니다!");
}
                   /* 결합된 템플릿 파일을 가져옵니다. 이 파일의 내용은 대체되었습니다*/
$comFileName = $ this-> ;compile_dir."/com_".$fileName.'.php';
                                                                           /* 대체된 파일이 존재하는지 확인하거나, 존재했지만 변경된 경우 다시 만들어야 합니다*/
if(!file_exists($comFileName) || filemtime($comFileName) < filemtime($tplFile)) {
/* 내부 교체 템플릿 메서드 호출*/
$repContent = $this->tpl_replace(file_get_contents($tplFile));
/* 시스템에서 결합한 스크립트 파일 저장*/
file_put_contents($comFileName, $repContent);
}
/* 클라이언트로 출력되는 처리된 템플릿 파일을 포함합니다*/
include($comFileName);
}

비공개 함수 tpl_replace($content) {
/* 왼쪽 및 오른쪽 구분 기호 사이의 규칙성에 영향을 미치는 특수 기호를 이스케이프합니다. 예를 들어 <{ }> ;Escape<{ }> $left = preg_quote($this->left_delimiter, '/');
$right = preg_quote($this->right_delimiter, '/');/* 템플릿의 다양한 식별자와 일치하는 정규식의 패턴 배열*/$ 패턴 = array(
/* 템플릿의 변수 일치(예: , "<{ $var }>" */'/'.$left.'s*$([a-zA-Z_x7f-xff][a-zA-Z0- 9_x7f-xff]*)s*'.$right.'/i',

/* 템플릿의 if 식별자와 일치합니다(예: "<{ if $col == "sex" }> <{ /if }> " * /
'/'.$left.'s*ifs*(.+?)s*'.$right.'(.+?)'.$left.'s* /ifs *'.$right.'/ies',
/* "<{ elseif $col == "sex" }>"와 같은 elseif 식별자와 일치 */
'/'.$left.'s*elses*ifs*(.+?)s*'.$right.'/ies',
/* 일치 else 식별자 기호(예: "<{ else }> */
'/'.$left.'s*elses*'.$right.'/is', /*는 템플릿의 루프 식별자를 일치시키는 데 사용되며 "<{ loop $arrs $value }> <{ /와 같이 배열의 값을 순회하는 데 사용됩니다. 루프}>" */
'/'.$left.'s*loops+$(S+)s+$([a-zA-Z_x7f-xff][a-zA-Z0- 9_x7f-xff]*)s*' .$right.'(.+?)'.$left.'s*/loops*'.$right.'/is',
/ *는 "<{ loop $arrs $key => $value }> <{ /loop}> */"과 같이 값 배열의 키와 합계를 순회하는 데 사용됩니다.
'/'.$left.'s* 루프+$(S+)s+$([a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*)s*=>s* $(S+)s*'.$right.'( .+?)'.$left.'s*/loop s*'.$right.'/is',
/* 포함 식별자와 일치합니다(예: '<{ include " header.html" }> */
'/'.$left.'s*includes+["']?( .+?)["']?s*'.$ 오른쪽.'/ie'                                                                                      > 🎜>
/* 템플릿의 정규식을 사용하여 바꾸기 수식과 일치하는 문자열 배열 */
$replacement = array(
/* templatetpl_vars ["var"]; */
'tpl_vars["${1}"]; >', 
/* 템플릿
'$ this->stripvtags('','${2}') ',

/* elseif 문자열 교체 */
' $this->stripvtags('',"")', /* else */
'',  
/* 다음 두 항목이 사용됩니다. 루프 교체 foreach 형식의 템플릿 식별자 */
'tpl_vars["${1}"] as $this->tpl_vars[ "$ {2}"]) { ?>${3}',
'tpl_vars["${1}"] as $this->tpl_vars["${2}"] => $this->tpl_vars["${3}"]) { ?>${4}',
/*포함 문자열 바꾸기 */
'file_get_contents($this->template_dir."/${1}")'
);

/* 일반 교체 기능을 사용하여 처리 */
$repContent = preg_replace($pattern, $replacement, $content);
/* 교체할 식별자가 아직 남아 있으면 재귀적으로 자신을 호출하여 다시 교체합니다.*/
if(preg_match('/ '.$ 왼쪽.'([^('.$right.')]{1,})'.$right.'/', $repContent)) {
$repContent = $ this->tpl_replace($repContent);
}
/* 대체된 문자열 반환 */
return $repContent;
}

/**
조건문에 사용된 변수를 해당 값으로 대체하기 위해 내부적으로 사용되는 전용 메소드 ​​
@paramstring $ expr은 템플릿에서 조건문의 시작 태그를 제공합니다.
@returnstrin의 끝 태그는 조건문 및 반환
*/개인 함수 Stripvtags($ expr, $statement='') {
/* 변수의 정규 일치*/
$var_pattern = '/s*$([a-zA-Z_x7f -xff][a-zA-Z0-9_x7f-xff]*)s*/is';
/* 변수를 값으로 바꾸기*/
$ expr = preg_replace($var_pattern, '$this->tpl_vars["${1}"]', $expr);
/* 시작 태그에서 따옴표를 이스케이프하고 바꿉니다*/
$expr = str_replace("\"", """, $expr);
/* 명령문 본문 및 닫는 태그에서 따옴표 바꾸기*/
$statement = str_replace("\"", """, $statement);
/* 처리된 조건문을 연결한 후 반환*/
$expr.$statement를 반환합니다.

}}

저작권 표시: 이 글은 원문입니다. 블로거의 글은 블로거의 허락 없이 복제할 수 없습니다.
위에서는 내용의 측면을 포함하여 PHP 정규 표현식을 소개했습니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿