글쓴사람 s
글쓴시간2007년 5월 1일 오후 12시 56분 26초
    제목할당
http://xtac.net/bbs/?prc=read&idx=951

저 역시도 clearsilver를 사용하다 보니 그 문법에 익숙해진탓에
커스터마이징을 좀 했습니다.
다운로드 페이지의 밴치마킹자료로 테스트 결과 101% ~ 110% 정도이니
뭐 그럭저럭 써줄만 합니다.
세세하게 컨트롤 하지 못하는 부분이 있어 앞으로 테스트는 쭉 해야될것 같습니다.
닫는 테그가 {/} 이 아니라 각 사용목적(루프, 분기) 등에 따라 {/@}, {/?} 다르다는 차이점이 있습니다.
사실 귀찮아서 루프나 분기문을 넘버링을 하거나 분석을 하지 않았기때문에 그럴수밖에 없었습니다 ㅋ
template_처럼 구조를 완벽히 파악하는 형태가 아니라 aaa{bbb}ccc{ddd}

더미하나 = 텍스트 aaa, 문법변환대상 bbb
더미둘 = 텍스트 ccc, 문법변환대상 ddd
로 분리하고 문법변환대상을 적절히 변형된 _compile_expression 함수를 통해 정상적인 php 문법으로 바꾸어 내고
다시 각 더미를 합하는 방식으로 처리했습니다.
그래서 공개는 부끄럽네요 ㅋ

{=aaa.ccc.fff = _SERVER['HTTP_HOST']}

{?aaa.ccc.fff == 'bbb.com'}
~~~
{/?}

{@x=0;2;1}
    {x.key_}k
{/@}

{=tmp = explode(',','a,b,c,d,e')}
{@item = tmp}
    {print_r(item.value_)}
{/@}

{@item = explode(',','a,b,c,d,e')}
    {print_r(item.value_)}
{/@}

아래는 밴치마킹자료 2-4를 할당문법으로 바꾼 예시입니다.

{@ hello = hello}
    {hello.var1}
    {hello.var2}
    {@ world = hello.world}
        {world.var3}
        {world.var4}
        {@ fine = world.fine}
            {fine.var5}
            {fine.var6}
            {fine.var7}
        {/@}
    {/@}
{/@}


더불어
preg_match('/^
                ((?:\.\s*)+)
                |(?:([A-Z_a-z\x7f-\xff][\w\x7f-\xff]*)\s*(\[|\.|\(|\-\>)?)
                |(?:(\])\s*(\-\>|\.|\[)?)
                |((?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+\-]?\d+)?)
                |((?:"(?:\\\\\\\\|\\\\"|[^"])*")|(?:\'(?:\\\\\\\\|\\\\\'|[^\'])*\'))
                |(===|!==|\+\+|--|\+\.|<<|>>|<=|>=|==|!=|&&|\|\||[,+\-*\/%&^~|<>()!])
                |(\s+)
                |(.+)
            /ix', $expression, $m)

이 정규 표현식의 각 라인별 정확하고도 상세한 목적을 좀 알려주심 안될까요?
대충 감은 잡고 작업했는데 설명을 한번 듣는것이 좋을듯 해서요
관리자 문법을 구체적으로 고안하고 소스수정까지 하셨다니..

익히기에 부담 없을 거 같고 좀 더 테스트해서 잘 사용하시기 바랍니다.



질문하신 내용은.. 표현식을 구성하는 요소들을 파악합니다

((?:\.\s*)+) 는    
    . 문자가 한 개 이상 (루프아이디 생략할 경우 여러 개가 될 수 있기에)

(?:([A-Z_a-z\x7f-\xff][\w\x7f-\xff]*)\s*(\[|\.|\(|\-\>)?)
    변수명 단독 혹은 변수명과 그 뒤에 [ 또는 . 또는 -> 가 붙은 경우

(?:(\])\s*(\-\>|\.|\[)?)
    ] 또는 ]-> 또는 ]. 또는 ][

((?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+\-]?\d+)?)
    숫자 정수 또는 실수

((?:"(?:\\\\\\\\|\\\\"|[^"])*")|(?:\'(?:\\\\\\\\|\\\\\'|[^\'])*\'))
    문자열 "sldkfj" 'xcv'

(===|!==|\+\+|--|\+\.|<<|>>|<=|>=|==|!=|&&|\|\||[,+\-*\/%&^~|<>()!])
    연산자

(\s+)     공백

(.+)     그 외 다른 문자
           
입니다.
07-05-01 14:37
s 감사합니다. 혹시 $m 에 어떤값이 담기는지도 알수있을까요?
07-05-01 21:06
관리자 $expression 대신에.. 'abc.def + xyz'  를 넣고 print_r($m) 해보시고..

그 다음엔 $m 에 걸려든 abc. 를 제외한 'def + xyz' 을 넣어서 해보시고 그런 식으로 해보시면 될거 같네요.
07-05-01 22:09
s 감사합니다 이미 그렇게 하고있습니다 ^^
좀 햇갈리는 부분이      있어서 질문드렸습니다.
질문을 좀 구체화해서 다시 드려야겠네요 ^^
07-05-01 23:16
관리자 소스레벨이다 보니 묻지 않은 답변을 하는 것도 실례가 될 수 있어서 하나마나한 답변들을 합니다.

친절한 소스는 아니지만 언더바 메뉴얼과 php메뉴얼이 있고, 구체적으로 질문하려다보면 스스로 답을 찾을 수 있으실거 같네요.
07-05-02 00:03
    이름
비밀번호
 
Since 2003-03-03 hosted on vultr.com