글쓴사람 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