php 템플릿

2007-05-27 오후 6:52

: {%for name=”list”%}
이렇게 템플릿 태그와 html 태그가 루프문, 인클루드 구문과 같이 있을때 안되던 것을 수정하여 가능하도록 하였습니다.

php 템플릿 컴파일 버전을 만들었습니다.

APM Template

다음과 같은 기능들을 구현하였습니다
누구나 쓰기 쉽도록 만들었습니다.

많은 조언좀 해주세요

Q. 템플릿 함수 및 변수 영역은 어떻게 쓰나요?
A. {%%} , <%%> 중 택하여 사용할 수 있다.

Q. 기존의 를 사용할 수 있나요?
A. 네 물론입니다. 를 활용하면 기존처럼 활용할 수 있습니다.

단, 은 템플릿 보다 좀더 복잡한 작업 할때 사용하세요, 즉 홈페이지 메인에 게시판등을 추출할때 활용하면 좋습니다.

템플릿의 목적은 MVC 를 구현하는 하나의 방법중 하나이기 때문에
php 는 데이타를 처리하여 최종값을 가져오고
tempate 은 display 쪽을 담당하여 작업 및 출력을 쉽도록 하기 위함입니다

Q. 디자이너도 템플릿 엔진을 통해 쉽게 include 를 활용할 수 있다던데 ?
A. APM Tempate 엔진은 HTML에서 include 를 쉽게 할 수 있도록 하였습니다.

index.html 에서 작업을 한다고 가정할 때

{%include file=”../head/head.html”%}

이라고 적어주면 head 폴더에 있는 head.html 를 불러다 자동으로 이미지 경로변경 및 컴파일 작업을 실행합니다.

디자이너라도 위와 같은 방법으로 쉽게 코딩을 할 수 있습니다.

또한 php에서 변수에 경로를 정해 놓고 그걸 HTML 에서 include 태그로 include 할 수 있습니다.

$cnt_[‘banner’] = ‘../cache/banner/banner_left.html’;

{%include file=”banner”%}
이와 같은 방법으로 파일을 HTML 에서 불러 쓸 수 있습니다.

위의 첫번째 방법을 권장 합니다.
1. 디자이너가 디자인을 변경할 때 쉽게 처리 할 수 있을 것이고
2. 나중에 수정작업이 필요할때도 index.html 만 열면 다른 파일들 경로가 보이기 1135051146.zip

[함수] 상대경로를 특정URI 기준의 절대경로로 변환하기

글쓴이 Fencer 날 짜 07-05-28 06:29 조 회 97

■ 이 함수가 필요한 경우

브라우저가 사용자에게 링크주소를 보여주거나, 자원을 다운 받아와서 보여주려면
먼저 현재문서에 포함되어 있는 상대경로를 현재문서의 URI에 맞추어 절대경로로 변환해야 하죠.
이를테면 에서 ../../abc.jpg 의 실제위치는
기준이 되는 문서의 URI가 뭐냐에 따라 바뀝니다.
현재문서가 http://test.com/a/b/c/d.php 라면 http://test.com/a/b/abc.jpg 가 되고,
현재문서가 http://test.com/a/b/d.php 라면 http://test.com/a/abc.jpg 가 되겠죠.
(이거 다들 아는 얘기죠. ^^ )

우리들도 굳이(!) 상대경로를 절대경로로 번역한 후 써야 하는 때가 종종 있습니다.
특정사이트의 문서를 긁어서 RSS나 E-mail로 제공한다거나;;;
문서를 파싱하는 봇을 만든다거나;;;
웹상에 존재하는 문서를 로컬에 저장할 수 있게 해준다거나…
이럴 경우 링크나 파일의 위치 지정은 상대경로 말고 절대경로로 지정해 주어야겠죠.
그러지 않으면 기준URI가 바뀌면서 문서내의 주소가 다 깨져버리니까요. ㅡ.ㅡ;;;
만약 를 그대로 저장하면 브라우저는 제대로 해석해내지 못 합니다.
물론 과 같이 써서 기준URI를 지정해줄 수도 있지만,
웹에서 메일을 받아보는 경우나 RSS Reader 등에서는 무용지물인 경우가 생깁니다.
한 페이지 내에 여러 문서의 내용이 한꺼번에 제시되기도 하고,
base href 자체를 허용하지 않는 경우도 있으니까요.

바로 그런 역할을 하는 번역(RFC에는 resolve라고 표현되어있는) 함수입니다.
서버에서 realpath() 함수를 통해 로컬의 상대경로를 절대경로로 바꾸는 거랑 비슷하죠.

1. 기존에 어딘가에 완성된 것이 꽤 존재할 법 한데 찾기 어렵더군요. 벌레 투성이거나.
2. RFC-2396을 최대한 지키고, IE의 번역결과와 똑같은 결과를 제공하고 싶었습니다. ;;;
만들면서 알게 됐는데, FireFox보다 IE가 RFC-2396을 사소한 부분까지 충실히 지키는 듯 싶더군요.

아래 함수는 RFC-2396의 normal, abnormal 예문을 비롯해서 다양한 테스트를 해보았는데요,
제가 테스트하기로는 항상 IE와 똑같았습니다. 애초에 그게 목표였거든요. ㅎㅎ
혹시 있을지도 모르는 벌레 발견하시면 신고 환영합니다. ^^

// 상대경로를 절대경로로 바꾸는 함수
// 작성자 : Fencer
// $path = 찾아낸 상대경로
// $base_uri = 기준이 되는 URI, 즉 현재문서나 또다른 어떤 URI

function http_path_to_url($path, $base_uri)
{
if (preg_match(“@^[a-z]{1}[a-z0-9+-.]+:[/]{2,}@i”, $path)) return $path;

$base_a = parse_url($base_uri);
$base_a[‘shp’] = substr($base_uri, 0, strlen($base_uri) – strlen($base_a[‘path’].(isset($base_a[‘query’]) ? ‘?’.$base_a[‘query’] : ”).(isset($base_a[‘fragment’]) ? ‘#’.$base_a[‘fragment’] : ”)));

if (preg_match(“@^//@i”, $path)) {
return $base_a[‘scheme’].”:”.$path;
} else if (preg_match(“@^?@”, $path)) {
return $base_a[‘shp’].$base_a[‘path’].$path;
} else if (preg_match(“@^#@”, $path)) {
return preg_replace(“@#$@”, “”, substr($base_uri, 0, strlen($base_uri)-strlen($base_a[‘fragment’]))).$path;
} else {
if (preg_match(“@^/@”, $path)) {
return $base_a[‘shp’].$path;
} else {
if (isset($base_a[‘path’]) && $base_a[‘path’]!=”) {
$base_a[‘file’] = str_replace(‘/’, ”, strrchr($base_a[‘path’], ‘/’)); // 파일명
if (!preg_match(“@/@”, $base_a[‘path’])) $base_a[‘file’] = $base_a[‘path’]; // 파일 만으로 되어 있을 경우 위에서 “/” 검색이 안 되므로
$base_a[‘dir’] = substr($base_a[‘path’], 0, strlen($base_a[‘path’]) – strlen($base_a[‘file’])); // 디렉토리, “/” 포함
}

$op_a = parse_url($path);
$tp_a = explode(“/”, $base_a[‘dir’].$op_a[‘path’]);
$tp_c = count($tp_a);
$ap_a = array();
for ($i=0; $i < $tp_c; $i++) {
if ($tp_a[$i]==”..”) {
if (count($ap_a) >= 1) $ap_a = array_slice($ap_a, 0, count($ap_a)-1);
if ($i==$tp_c-1) $ap_a[] = “”; // ..이 마지막일 경우
} else if ($tp_a[$i]==”.”) {
if ($i==$tp_c-1) $ap_a[] = “”; // .이 마지막일 경우
} else {
$ap_a[] = $tp_a[$i];
}
}

$ap = implode(“/”, $ap_a);
if (!preg_match(“@^/@”, $ap)) $ap = “/”.$ap;

return $base_a[‘shp’] .$ap .(isset($op_a[‘query’]) ? ‘?’.$op_a[‘query’] : ”) .(isset($op_a[‘fragment’]) ? ‘#’.$op_a[‘fragment’] : ”);
}
}
}

?>

////////////////////////////////////////////////////////////////////////
// 함수 사용 예

$rel = “허허ss;df/.././../../싱하ㅤㅎㅛㅎ.htm?dsfs=../sdfs.aaa#5”;

echo ““;
echo “상대경로 : “.$rel.”


“;
echo “기본URI : “.$base_uri.”


“;
echo “브라우저의 변환결과 : 결과


“;
echo “함수의 변환결과 : “.http_path_to_url($rel, $base_uri);

?>

하시면…

상대경로 : 허허ss;df/.././../../싱하ㅤㅎㅛㅎ.htm?dsfs=../sdfs.aaa#5
기본URI : http://id:pw@ddd.com:443/a/b/c/d/하;하/f/아ㅤㅎㅐㅎㅤㅎㅐㅎ.php?x=1#2
IE의 변환결과 : http://id:pw@ddd.com:443/a/b/c/d/싱하ㅤㅎㅛㅎ.htm?dsfs=../sdfs.aaa#5
함수의 변환결과 : http://id:pw@ddd.com:443/a/b/c/d/싱하ㅤㅎㅛㅎ.htm?dsfs=../sdfs.aaa#5

…로 나옵니다. IE와 함수의 변환결과가 똑같죠.

////////////////////////////////////////////////////////////////////////
// 활용 예 : 문서내의 여러 상대경로를 모두 절대경로로 바꿔놓기

이제 HTML 속에 있는 src, href의 상대경로를
base_uri 기준의 절대경로로 재구성하려면 다음과 같이 하면 되겠죠.
href, src 정도만 검색해서 절대경로로 변환해줍니다.

아, 아래 내용은 그냥 예시입니다. ^^;
문서내의 모든 주소를 찾아내려면 좀 더(!) 세밀한 정규표현이 필요합니다.

{
$pattern_a = array(“@(s*href|s*src)(s*=s*'{1})([^’]+)(‘{1})@ie”
, “@(s*href|s*src)(s*=s*”{1})([^”]+)(“{1})@ie”
, “@(s*href|s*src)(s*=s*)([^s>”‘]+)(s|>)@ie”);
$replace_a = array(“‘\1\2’.http_path_to_url(‘\3’, ‘$base_uri’).’\4′”
, “‘\1’.stripslashes(‘\2’).http_path_to_url(‘\3’, ‘$base_uri’).stripslashes(‘\4’)”
, “‘\1\2’.http_path_to_url(‘\3’, ‘$base_uri’).’\4′”);
return preg_replace($pattern_a, $replace_a, $content);
}

$base_uri = 문서 주소;
$content = 문서 내용;

$content = http_src_to_abs($content, $base_uri);

?>

메일을 PHP로 받아서 파싱하기

희망주기(hopegiver) http://cafe.naver.com/hopegiver/8

2004년 6월 23일에 phpschool.com 에 올린 글입니다.

아주 오래전에 사용했던 기술인데 최근에 다시 필요해서 정리하는 김에 이곳에 올려봅니다.
그런데 제목이 좀 아리까리 하네요. ^^; 제목을 어떻게 표현해야 할지 몰라서..
기존에 널리 사용되던 기술인데 걍 PHP로 함 해봤습니다.

[제작동기]
고객들이 보내는 메일을 파싱해서 카테고리 별로 데이타베이스에 저장하기 위해서..
더 나아가 자동응답 메일을 발송하기 위해서..

[포인트]
sendmail 의 alias 기능을 이용해서 PHP 쉘 스크립트를 구동시킨다.
(다른 모든 메일서버에서도 비슷한 방법으로 사용이 가능하다.)

[준비사항]
1. sendmail 의 환결설정 파일에서 프로그램실행이 가능하도록 수정한다.
2. 특정한 이메일 아이디를 하나 선택한다.

[/etc/sendmail.cf 파일수정]
맨 아랫줄에 보면 아래와 같은 구문이 있다.. 대충 아래와 같이 수정한다.
Mprog, P=/bin/sh, ………
T=X-Unix/X-Unix/X-Unix,
A=/bin/sh -c $u

[/etc/aliases 에 계정추가]
# PHP Mailer
phpmailer: |/root/phpmailer.php

[/root/phpmailer.php 파일작성]
#!/usr/local/bin/php
while(!feof($fp)) {
$line = fgets($fp, 1024);
#여기서 파싱작업을 수행함..
}
fclose($fp);

?>

최근에 저는 이 방법을 이용해서 저에게 메일이 오면 제목을 파싱해서 특정 이메일인
경우에 자동으로 문자메시지를 남기도록 했습니다. 조금이라도 도움이 되셨길 바라며..