'자작소스/PHP'에 해당되는 글 50건

  1. 2007.09.12 특정 문자열만 추출하는 함수
  2. 2007.09.12 웹파일(원격)을 로컬에 저장하는 함수
  3. 2007.09.12 웹페이지 소스 읽어 오는 함수
  4. 2007.06.29 PEAR Pager Class 간단 메뉴얼
  5. 2007.06.29 문자열 자르기 함수 v1.0
  6. 2007.06.29 파일쓰기 함수 v1.0
  7. 2007.06.29 파일업로드 함수 v1.0
  8. 2007.06.29 빈 값 체크 함수 v1.0
  9. 2007.06.29 페이지 이동 함수 v1.0
  10. 2007.06.29 입력된 시간을 5분 단위로 끈어서 입력
2007. 9. 12. 10:22

특정 문자열만 추출하는 함수


<?php
/**
 * 문자열중 특정 내용만 추출하는 함수
 * $contents 는 되도록이면 참조형으로 넘길것
 * USE_STATIC 문자열 추출후 그후에 나오는 문자를 또 추출하려 할때 위치를 기억함
 * USE_SKIP 추출할 문자열 이전에 동일 문자열이 있을경우 offset 을 특정문자열까지 건너뛸려고 할때 사용
 * USE_RESET _STATIC 모드로 사용중 처음부터 다시 문자열을 찾으려고 할경우 offset을 0으로 리셋
 * 옵션을 주지 않고 사용할경우 최초문자열만을 리턴
 *
 * @param text $contents
 * @param text $start_string
 * @param text $end_string
 * @param int $opt (USE_STATIC | USE_SKIP | USE_RESET)
 * @return mix(text/null)
 */
define('USE_STATIC',1);
define('USE_SKIP',2);
define('USE_RESET',4);
function parseString($contents, $start_string, $end_string, $opt = NULL) {
    if($opt & USE_STATIC) {
        static $pos = 0;
        
        if($opt & USE_RESET) {
            $pos = 0;
            return NULL;
        }
    }
    else {
        $pos = 0;
    }
    
    $spos = strpos($contents, $start_string, $pos);
    if($spos === FALSE) {
        return NULL;
    }
    $spos = $spos + strlen($start_string);
    $pos = $spos;

    if($opt & USE_SKIP) {
        return NULL;
    }
    
    $epos = strpos($contents, $end_string, $pos);
    if($epos === FALSE) {
        return NULL;
    }
    $pos = $epos;
    
    return substr($contents,$spos,$epos-$spos);
}

?>

2007. 9. 12. 10:15

웹파일(원격)을 로컬에 저장하는 함수


<?php
/**
 * 원격파일을 로컬에 저장
 *
 * @param text $url
 * @param text $savefile
 */
function getRemoteFile($url,$savefile) {
    $dirname = dirname($savefile);
    $url_info = parse_url($url);
    
    if(!is_dir($dirname)) {
        mkdir($dirname,0777);
    }
    
    $fp = fsockopen($url_info['host'], 80);
    if(!$fp) {
        return FALSE;
    }
    
    $fp1 = fopen($savefile,'w+');
    if(!$fp1) {
        return FALSE;
    }
    
    fputs($fp,"GET ".$url_info['path'].($url_info['query'] ? '?'.$url_info['query'] : '')." HTTP/1.0\r\n");
    fputs($fp,"Host: ".$url_info['host']."\r\n");
    fputs($fp,"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n");
    fputs($fp,"Connection: close\r\n\r\n");
    
    while(trim($buf = fgets($fp,1024))) {}  //헤더부분 건너뜀

    while(!feof($fp)) {
        fwrite($fp1,fgets($fp,1024));
    }
    
    fclose($fp1);
    fclose($fp);
    
    return TRUE;
}
?>

2007. 9. 12. 10:14

웹페이지 소스 읽어 오는 함수


<?php
/**
 * 웹페이지 소스 가져오는 함수
 *
 * @param text $url
 * @param array(
 *                  'method' => 'GET/POST',
 *                  'port' => 80,
 *                  'cookie'=> array (
 *                                      'key' => 'value',
 *                                      'key' => 'value'
 *                                  ),
 *                  'referer' => 'http://domain.com',
 *               ) $opt
 * @return array
 */
function getPageSource($url, $opt = array()) {
    
    $result = array('','');
    
    if(empty($opt)) {
        $opt['method'] = 'GET';
        $opt['port'] = 80;
    }
    else {
        if(isset($opt['method'])) {
            $opt['method'] = strtoupper($opt['method']);
            if($opt['method'] !== 'GET' && $opt['method'] !== 'POST') {
                exit("FUNCTION getPageSource ERROR : \$opt['method'] is only GET or POST");
            }
        }
        
        if(isset($opt['port']) && ctype_digit($port) === FALSE) {
            exit("FUNCTION getPageSource ERROR : \$opt['port'] is only integer value");
        }
    }
    
    $url_info = parse_url($url);
    $fp = fsockopen($url_info['host'], $opt['port']);

    if(!$fp) {
        return array();
    }
    
    fputs($fp,$opt['method']." ".$url_info['path'].($opt['method'] === 'GET' && $url_info['query'] ? '?'.$url_info['query'] : '')." HTTP/1.0\r\n");
    fputs($fp,"Host: ".$url_info['host']."\r\n");
    fputs($fp,"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n");
    
    if(isset($opt['referer'])) {
        fputs($fp,"Referer: ".$opt['referer']."\r\n");
    }
    
    if(isset($opt['cookie'])) {
        foreach($opt['cookie'] as $value => $key) {
            fputs($fp,"Cookie: ".$key."=".urlencode($value).";\r\n");
        }
    }
    
    if($opt['method'] === 'POST') {
        fputs($fp,"Content-Type: application/x-www-form-urlencoded\r\n");
        fputs($fp,"Content-Length: ".strlen($url_info['query'])."\r\n");
        fputs($fp,"Connection: close\r\n\r\n");
        fputs($fp,$url_info['query']);
    }
    else {
        fputs($fp,"Connection: close\r\n\r\n");
    }
    
    while(trim($buf = fgets($fp,1024))) {  //respose header 부분을 읽어옵니다.
        $result[0] .= $buf;
    }

    while(!feof($fp)) {  //response body 를 읽어옵니다.
        $result[1] .= fgets($fp,1024);
    }
    
    fclose($fp);
    
    return $result;
}
?>

2007. 6. 29. 15:37

PEAR Pager Class 간단 메뉴얼

Pager 는 말그대로 페이징 클래스입니다.

설치방법은 php 설치 디렉토리에서

pear install Pager 엔터 하면 설치가 되고

사용은 require_once 'Pager/Pager.php'; 하시고 쓰시면 되겠습니다.

사용방법은 단순히 인스턴스 생성시 파라메타로 설정값을 넘기면

페이징 링크를 생성해서 사용할수 있는 아주~ 간단한 클래스입니다.

사용예제는 아래와 같습니다.


<?php
$params = array(
    'mode'      => 'Jumping',
    'extraVars' => array('sType' => $sType, 'sString' => $sString),
    'totalItems'  => (int)$total,
    'delta'  => 10,
    'perPage' => 30,
    'prevImg' => '[◀]',
    'nextImg' => '[▶]',
    'firstPageText' => '맨처음',
    'lastPageText' => '마지막',
    'curPageLinkClassName' => 'pagerStyle'
);
$pager =& Pager::factory($params);
$page =& $pager->getLinks(); 
?>

이렇게 만들면 $page에 배열로된 링크가 만들어져 리턴됩니다.
그걸 뿌려주기만 하면 끝이죠. 옵션에 관한 설명은 아는거만 ^^;

itemData [array] -
페이징에 사용할 내용 전체를 배열로 넣을수 있습니다.
그럼 배열의 총수가 total 이 되는거죠.

totalItems [integer]-
itemData 에 내용전체를 넣지않고 페이징될 총 갯수만 설정할수 있습니다.

perPage [integer] -
한페이지에 글이 몇개인지.

delta [integer]-
페이지 번호를 몇개 보여줄지.

mode [string] "Jumping" or "Sliding"
점핑은 보통 사용하는 페이징 방식이고 슬라이딩은 일정페이지 이상이 되면
현재 페이지가 항상 페이지 번호 중간에 나오는 방식입니다.(구글 결과페이지 참고)

httpMethod [string] "get" or "post" -
페이징 변수를 get,post로 넘길건지.

linkClass [string] -
페이징에 걸 스타일 시트

urlVar [string] "pageID" -
페이지 번호로 사용할 변수이름

altFirst [string]
altPrev [string]
altNext [string]
altLast [string]
altPage [string]
- 마우스 올렸을때 나타낼 문자열

prevImg [string] "<<"
nextImg [string] ">>"
- 앞,뒤 링크 문자 혹은 이미지 아이콘으로 설정

separator [string] -
페이지 번호에 특정 문자,이미지를 추가할수 있습니다.

curPageLinkClassName [string]
- 현재페이지 번호에 적용할 스타일 시트

firstPageText [string]
lastPageText [string]
- 맨처음,맨끝 페이지 표시할때 사용할 문자열

extraVars [array]
- 페이징 링크에 추가할 변수들 넣을수 있습니다.

머 대충 이정도구요.

나머지 메소드들도 간단히 아는거만 ^^;

Pager::getCurrentPageID() -- 현재페이지 번호리턴

Pager::getLinks() --  생성된 링크를 배열로 리턴

Pager::getNextPageID() -- 다음페이지 번호 리턴

Pager::getOffsetByPageId() -- 페이지에 해당하는 limit 리턴

Pager::getPageData() -- itemData에 전체 내용을 배열로 넣었을때 페이지에 해당하는 배열내용을 가져울수 있습니다.

Pager::getPreviousPageID() -- 이전 페이지 번호

Pager::getperpageselectbox ([integer $start = 5 [, integer $end = 30 [, integer $step = 5 [, boolean $showAllData = false [, string $optionText = '%d']]]]]) -- 페이지 바로가기 selectbox html 을 리턴합니다.


대충 이정도구요.
아쉬운 점이라면 이전10개 다음10개 이기능이 없더군요.
페이징관련 소스를 찾고 있으시거나 공부해보실 분이라면
한번 봐두는 것도 좋을듯 하네요.

http://pear.php.net/manual/en/package.html.pager.php
2007. 6. 29. 15:36

문자열 자르기 함수 v1.0


<?php
//문자열 자르기 함수(글자수 기준)
function cutstr($string,$num,$tail=""){
 if(strlen($string)<$num) return $string;
 for($i=0;$i<$num;$i++)
  if(ord($string[$i])>127) $i++;
 return substr($string,0,$i).$tail;
}

//문자열 자르기 함수(글자 길이 기준)

function cutstr($string,$num,$tail=""){
 if(strlen($string)<$num) return $string;

 while(ord($string[$num])>127) $num--;
 return substr($string,0,$num).$tail;
}
?>

2007. 6. 29. 15:34

파일쓰기 함수 v1.0

function writeText($filename,$str,$mode='a+') {
 $fp=fopen($filename,$mode);

 if($fp) {
   fwrite($fp,$str);
   fclose($fp);
   chmod($filename,0707);

 }
}


writeText('../test.txt','테스트입니다.','w+');

2007. 6. 29. 15:33

파일업로드 함수 v1.0


<?php
function uploadFile($dir,$upfile="upfile") {

 if($_FILES[$upfile]['size'] > 2000000)
  alertPage("업로드는 파일크기 2메가 바이트 이하만 할수 있습니다.","-1");

 $fname = strtolower($_FILES[$upfile]['name']);

 if(strpos($fname,".php") || strpos($fname,".htm"))
  alertPage("파일명에는 .php, .htm, .html 과 같은 단어가 들어갈수 없습니다.\\n\\n변경후 다시 업로드 해주세요.","-1");

 $tmp_nm = explode(".",$fname);
 $ext = $tmp_nm[(count($tmp_nm)-1)];

 if(empty($ext))
  alertPage("확장자가 없습니다.","-1");

 $filename = $upfile."_".time().".".$ext;

 if(!move_uploaded_file($_FILES[$upfile]['tmp_name'],$dir.$filename))
  alertPage("파일복사 실패\\n\\n다시 시도해주세요.","-1");

 return $filename;
}
?>


<input type="file" name="upfile">

$filename = uploadFile('경로','upfile');

2007. 6. 29. 15:32

빈 값 체크 함수 v1.0


<?php
function checkVariable() {
 $var_cnt = func_num_args();
 $var_val = func_get_args();
 if(in_array('',$var_val))
  alertPage('입력값이 잘못되었습니다.\\n\\n다시확인해주세요.');
}

//example
checkVariable($_GET["val"],$_POST["val1"]);
?>

2007. 6. 29. 15:26

페이지 이동 함수 v1.0


<?php
// 경고창 후 백이동
function alertPage($msg,$step='-1'){
 exit('<script language="javascript" type="text/javascript">alert("'.$msg.'");'.($step != null ? 'history.go('.$step.');':'').'</script>');
}

// 경고창 후 창닫기
function closePopUp($msg=null) {
 exit('<script language="javascript" type="text/javascript">'.($msg != null ? 'alert("'.$msg.'");' : '').'top.close();</script>');
}

// 경고창 후 페이지 이동
function movePage($url,$msg=null){
 exit('<script language="javascript" type="text/javascript">'.($msg != null ? 'alert("'.$msg.'");' : '').'self.location.replace("'.$url.'");</script>');
}

//경고창 후 페이지 Replace(history 않남게)
function replacePage($url,$msg=null) {
 exit('<script language="javascript" type="text/javascript">'.($msg != null ? 'alert("'.$msg.'");' : '').'self.location.replace("'.$url.'");</script>');
}
?>

2007. 6. 29. 15:23

입력된 시간을 5분 단위로 끈어서 입력

입력값이 "2006/12/31/23/56" 이라면 앞의 모든 값들이 시간 규칙에 맞게 +1 이 되어야
하기때문에 따로따로 나눠서 계산을 하면 상당히 구문도 길어지고 복잡해지니까
타임스탬프로 계산하는게 좋을꺼 같구요.
제가 생각한 방법은 이렇습니다.



<?php
$str = "2006/12/31/23/56";
$tmp = explode("/",$str);
$min = ($tmp[4]%5>0)? 5 - ($tmp[4]%5) : 0 ;
$time = mktime($tmp[3],$tmp[4]+$min,0,$tmp[1],$tmp[2],$tmp[0]);
echo date("Y/m/d/H/i",$time); 
?>




분의 값을 5 에서 5로 나눈 나머지 값을 빼주면 5의 배수값중에 몇분이 모자라는지 나오겠죠.
분의 값이 7 분일경우 결과값은 3이 되겠져. 5 -(7%5) = 3분
이 값을 타임스탬프로를 생성할때 더해주면 5로 딱 떨어지는 값이 나올꺼구요.
그후에 date() 함수로 입맛에 맞게 형식을 만들면 되겠네요