문제

문자열을 읽고 {var}를 감지 한 다음 {var} 대신 file_get_contents ( 'var.php')를 수행해야합니다. "var"는 테스트, 접촉 형식 등과 같은 이름을 지정할 수 있습니다. var가 무엇인지 알고 싶지 않습니다. 하드 코딩 된 상태를 수행하는 것이 아니라 주변의 대문자 영숫자 태그 만 볼 수 있습니다. 곱슬 브레이스를하고 파일 _get_contents ()를로드하여로드하십시오.

나는 preg_match와 preg_replace를 사용해야한다는 것을 알고 있지만, 나는 이것에 대한 regexps를 넘어서고 있습니다.

이것이 어떻게 유용합니까? WordPress를 연결하는 데 유용합니다.

도움이 되었습니까?

해결책

위의 Orion에는 올바른 솔루션이 있지만 간단한 경우 콜백 기능을 사용할 필요는 없습니다.

파일 이름이 AZ + 하이픈이라고 가정하면 Regex에서 PHP /E 플래그를 사용하여 1 줄로 수행 할 수 있습니다.

$str = preg_replace('/{([-A-Z]+)}/e', 'file_get_contents(\'$1.html\')', $str);

{var}의 모든 인스턴스를 Var.html의 내용으로 바꿉니다. 특정 디렉토리를 지정 해야하는 경우 A 경로를 두 번째 용어로 접두사 할 수 있습니다.

위에서 설명한 것과 동일한 모호한 보안 걱정이 있지만 특정한 것을 생각할 수는 없습니다.

다른 팁

여러 가지 일을해야합니다. 문자열로 전처리하려는 페이지 데이터를 얻기 위해 레그 워크를 수행 할 수 있다고 가정합니다.

  1. 먼저 올바르게 일치하려면 정규 표현이 필요합니다. 그것은 같은 것과 함께 매우 쉬워야합니다 /{\w+}/.

  2. 다음으로 모든 플래그를 사용하여 Preg_match를 사용하여 페이지 데이터에서 오프셋 위치를 가져와야합니다. 이 오프셋을 사용하면 문자열을 전, 일치 및 경기의 일부로 나눌 수 있습니다.

  3. 세 부분이 있으면 포함을 실행하고 다시 고집해야합니다.

  4. 거품, 린스, 반복.

  5. 더 이상 변수를 찾지 않으면 중지하십시오.

이것은 매우 효율적이지 않으며 아마도 더 나은 방법이있을 것입니다. 대신 preg_split을하는 것을 고려하고 나누고 싶을 수도 있습니다. /[{}]/. 어떻게 슬라이스하더라도 들어오는 데이터를 신뢰할 수 있다고 가정하면 전체 프로세스를 많이 단순화합니다. 이렇게하려면 다음과 같은 코드를 제시 할 것입니다.

  1. 콘텐츠를 가져 가서 그렇게 나누십시오. $parts = preg_split('/[{}]/', $page_string);

  2. 다음 기준으로 부품에 재귀 기능을 작성하십시오.

    • Arg의 길이가 <3 인 경우 정지하십시오
    • 그렇지 않으면 구성된 새 배열을 반환하십시오
    • $ arg [0]. load_data ($ arg [1]). $ arg [2
    • 또한 $ argv에 남은 것은 무엇이든 [3 ...
  3. $ 부품 이상의 기능을 실행하십시오.

regexes (신 금지) 없이는 다음과 같은 것없이 할 수 있습니다.

//return true if $str ends with $sub
function endsWith($str,$sub) {
    return ( substr( $str, strlen( $str ) - strlen( $sub ) ) === $sub );
}

$theStringWithVars = "blah.php cool.php awesome.php";
$sub = '.php';
$splitStr = split(" ", $theStringWithVars);
for($i=0;$i<count($splitStr);$i++) {
    if(endsWith(trim($splitStr[$i]),$sub)) {
        //file_get_contents($splitStr[$i]) etc...
    }    
}

내 머리 꼭대기에서, 당신은 이것을 원합니다 :

// load the "template" file
$input = file_get_contents($template_file_name);

// define a callback. Each time the regex matches something, it will call this function.
// whatever this function returns will be inserted as the replacement
function replaceCallback($matches){
  // match zero will be the entire match - eg {FOO}. 
  // match 1 will be just the bits inside the curly braces because of the grouping parens in the regex - eg FOO
  // convert it to lowercase and append ".html", so you're loading foo.html

  // then return the contents of that file.
  // BEWARE. GIANT MASSIVE SECURITY HOLES ABOUND. DO NOT DO THIS
  return file_get_contents( strtolower($matches[1]) . ".html" );
};
// run the actual replace method giving it our pattern, the callback, and the input file contents
$output = preg_replace_callback("\{([-A-Z]+)\}", replaceCallback, $input);

// todo: print the output

이제 Regex를 설명하겠습니다

 \{([-A-Z]+)\}
  • 그만큼 \{ 그리고 \} 곱슬 버팀대와 일치하도록 지시하십시오. 슬래시가 필요합니다 { 그리고 } 특수 캐릭터이므로 탈출이 필요합니다.
  • 그만큼 ( 그리고 ) 그룹화를 만듭니다. 기본적으로 이것은 매치의 특정 부분을 추출 할 수 있습니다. 나는 위의 기능에서 그것을 사용하여 브레이스 자체와 일치하지 않고 버팀대 내부의 것들과 일치합니다. 내가 이것을하지 않았다면, 나는 { 그리고 } 경기에서 성가 시게 될 것입니다
  • 그만큼 [-A-Z] "대문자 일치 또는 a -
  • 그만큼 +[-A-Z] 우리는 하나 이상의 문자가 있어야하지만 모든 숫자를 가질 수 있음을 의미합니다.

비교적 말하면, 정규 표현은 비싸다. 어떤 파일을로드할지 파일을 파일해야 할 수도 있지만 교체를 위해 파일을 필요로하지 않으며 정규 표현식을 사용해서는 안됩니다. 결국, 당신은 당신이 무엇을 교체하고 있는지 정확히 알고 있으므로 왜 퍼지 검색이 필요합니까?

연관 배열 및 str_replace를 사용하여 교체품을 수행하십시오. str_replace는 한 번에 여러 대체를 수행하기위한 배열을 지원합니다. 하나의 라인 대체, 루프 없음.

예를 들어:

$substitutions = array('{VAR}'=>file_get_contents('VAR.php'),
'{TEST}'=>file_get_contents('TEST.php'),
...
);

$outputContents = str_replace( array_keys($substitutions), $substitutions, $outputContents);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top