문제

개요

끝 주위의,2009 년 나는 간단 템플릿 생성 시스템에 대한 PHP/HTML 에서 사용되는 것을 통해 우리의 디자이너에 대한 안내 책자 상품 형식이다.이 시스템의 목적을 허용하는 것이 템플릿에서 그렇지 않으면 순수한 HTML 를 통해 사용자 정의하는 태그는 PHP 에 의해 처리됩.예를 들어,템플릿 페이지은 다음과 같이 표시될 수 있습니다.

<tt:Page template="templates/main.html">
  <tt:Content name="leftColumn">
    <p> blah blah </p>
    ...
  </tt:Content>
  <tt:Content name="rightColumn">
    <p> blah blah </p>
    ...
  </tt:Content>
</tt:Page>

서식은 아래와 같이 설정합니다:

<html>
  <head>...</head>
  <body>
    <div style="float:left; width:45%">
      <tt:Container name="leftColumn" />
    </div>
    <div style="width:45%">
      <tt:Container name="rightColumn" />
    </div>
  </body>
</html>

외에도 페이지와 Content/Container 태그,거기에 몇 가지 다른 범주에 포함된 핵심 물건에 대한 유량제어,반복 컬렉션을 출력하는 동적 가치,등등.프레임워크 설계된 그래서 그것은 매우 쉽게 추가 자신의 설정의 범주에 등록된 다른 접두사와 네임스페이스가 있습니다.

사용자 정의 태그를 PHP

우리는 어떻게 분석한 사용자 정의 태그?때문에 없는 것을 보장 HTML 파일 구성된 XML,솔루션 같은 XSLT/XPATH 지 않을 것이 신뢰할 수 있습니다.대신,우리가 사용하는 regex 을 찾기 위해 태그와 접두사,그리고 사람들을 대체 PHP 코드입니다.PHP 코드를 스택 기반 디자인...에 따라 발생하는 열 태그를 나타내는 개체를 태그를 만들에 밀어 스택,그리고 그것의"초기화 함수"(는 경우)에 실행합니다.때마다 등록 폐 태그를 발견한 가장 최근의 개체가 팝 스택,그리고 그것의"렌더링 기능"을 실행됩니다.

그래서,후에는 프레임워크 대체 템플릿 태그 PHP,우리의 예 페이지은 다음과 같이 보일 수 있습니(에서 부동산 비탈):

<?php $tags->push('tt', 'Page', array('template'=>'templates/main.html')); ?>
  <?php $tags->push('tt', 'Content', array('name'=>'leftColumn')); ?>
    <p> blah blah </p>
    ...
  <?php $tags->pop(); ?>
  <?php $tags->push('tt', 'Content', array('name'=>'rightColumn')); ?>
    <p> blah blah </p>
    ...
  <?php $tags->pop(); ?>
<?php $tags->pop(); ?>

좋은,나쁜,고 eval

지금은,실행하는 방법의 새로 생성된 PHP?나는 생각할 수 있는 몇 가지 옵션이 여기 있습니다.가장 쉽게 단순히 eval 문자열에는 충분히 잘 작동합니다.그러나 어떤 프로그래머는 당신을 말할 것이다"eval 은 악마,그것을 사용하지 않는..."그래서 질문은 거기에 아무것 보다는 더 적합한 eval 는 우리가 사용할 수 있나?

생각했던 사용하여 일시적 또는 캐시 파일,사용 php:// 출력 스트림 등,하지만 지금까지 나는 이들을 볼 수 있습니다 제안하지 않는 진짜 어떤 이점 eval.캐시할 수 있습니다 것,그러나 실제로 모든 사이트에 우리가 이 일은 이미 엄청나게 빠른,그래서 나는 할 필요가 없는 속도의 최적화에 이점이다.

질문

에 대한 각각의 것이트:그것은 좋은 생각입니까?생각할 수 있는 더 나은 대안은?

  • 전체적인 아이디어에서 일반적으로(사용자 정의 html 태그/php)
  • 변환 태그를 php 코드 대신 직접 처리
  • 스 기반 접근법
  • 의 사용 eval (또는 유사한)

그리고 읽어 주셔서 감사합니다 TIA 어떠한 조언입니다.:)

도움이 되었습니까?

해결책

게 옹호하는 다른 방법으로 접근하고 있습니다.을 생성하는 대신 PHP 의 코드를 동적으로 다음 방법을 찾고 그것을 실행하기 위해 안전하게 실행,그것은 직접 발생합니다.수 프로세스의 전체 블록에서 HTML 중 하나를 통과 및 처리 각 태그 당신은 그것을 발생 immediately.

쓰 루프를 찾는다.기본적인 구조는 다음과 같습니다.

  1. 찾기 위해 사용자 정의 태그는 당신이 찾아에 위치 n.
  2. 기 전에 모든 것 위치 n 해야 하는 간단한 HTML,그래서 저장하거나 그에 대한 처리는 출력 그것은 바로(없는 경우에는 태그 $tags 스택에 당신은 아마 없을 저장할 필요가 어디서나).
  3. 실행하여 해당 코드를 지정합니다.을 생성하는 대신을 호출하는 코드 $tags->push, 전화 $tags->push 이 직접 있습니다.
  4. 1 단계로 이동.

이 방법으로 당신은 전화 PHP 기능은 바로,당신은 결코 구축 PHP 코드에 비행한 후 실행됩니다.에 대한 필요 eval 사라입니다.

당신은 기본적으로 두 가지 경우를 위해 3 단계.가 발생할 경우 개방 태그를 할 것입니다 즉각적인 push.그런 다음 나중에 때 닫는 태그는 당신이 할 수 있는 pop 한 다음을 처리하는 태그에 적절한 방법으로,이제는 처리의 전체 내용을 사용자 지정 요소입니다.

그것은 또한 더 많은 효율적인 프로세스 HTML 이 방법입니다.을 하는 여러 개의 검색과 대체에서 HTML 문자열이 비효율적으로 각색하고 각각의 대체 O(n 는)문자열의 길이.의 의미 너는 반복적으로 스캔한 문자열 이상,그리고 각각의 시간을 당신이 보충이 있을 생성하는 새로운 문자열의 길이 있습니다.이 있는 경우 20 킬로바이트는 HTML 의한 다음 각각의 대체를 포함 찾을 통해 20 킬로바이트는 다음을 만드는 새로운 20 킬로바이트 문자열이다.

다른 팁

게시 또 다른 대답이기 때문에 그것의 근본적으로 다른에서는 첫 번째 수도 가치가있다.

기본적으로,이 질문을 실행하는 방법 PHP 코드와 함께 정규식으로 이루어져 있습니다.그것은 보이지 않을 수도 있습니다는 명백하지만,이것은 무엇을 평가하고자 수행할 수 있습니다.

그는 말했다,대신 패스의독의 영화"꿈"의 무대가 된 곳고 그런 다음 eval,당신이 사용할 수 있습니 PHP preg_replace_callback 수행할 수 있는 기능을 한 조각 때 코드의 일치합니다.

는 방법은 여기를 참조하십시오 기능이 작동합니다: http://us.php.net/manual/en/function.preg-replace-callback.php

네 대신 eval,당신은 무엇을 할 수 있 젠드와 다른 중요한 프레임워크 사용하십시오 출력 버퍼링:

ob_start();
include($template_file); //has some HTML and output generating PHP
$result = ob_get_contents();
ob_end_clean();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top