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. 7. 3. 12:01

PHP Sleep 함수 구현


<script language="JavaScript">
<!--
function sleep(sec) {
    var now = new Date();
    var exitTime = now.getTime() + (sec*1000);
    while (true) {
          now = new Date();
          if (now.getTime() > exitTime) return;
    }
}

sleep(5);
alert('메롱');
//-->
</script>




출처 : PHPSCHOOL 지우님
2007. 6. 29. 15:56

정규표현식 기초

정규표현식의 기본 문법

 

정규표현식은 소프트웨어에 따라서 방식이나 지원 범위가 다를 있습니다.

 

^The”

"The" 시작하는 문자열

"of despair$"

"of despair" 끝나는 문자열

"^abc$"

"abc" 시작하고 "abc" 끝나는 문자열 ("abc" 라는 문자열도 해당됨)

"notice"

"notice" 들어 있는 문자열

 

"ab*"

a 다음에 b 0 이상 ("a", "ab", "abbb", )

"ab+"

a 다음에 b 1 이상 ("ab", "abbb", )

"ab?"

a 다음에 b 있거나 없거나 (ab 또는 a)

 

"ab{2}"

a 다음에 b 2 있는 문자열 ("abb")

"ab{2,}"

a 다음에 b 2 이상 ("abb", "abbbb", .)

"ab{3,5}"

a 다음에 b 3개에서 5 사이 ("abbb", "abbbb", 또는 "abbbbb")

 

'*', '+', '?' 각각 "{0,}", "{1,}", "{0,1}" 같습니다.

 

( ) 문자열을 묶음 처리할 사용

"a(bc)*"

a 다음에 “bc” 0 이상 (묶음 처리)

"a(bc){1,5}"

a 다음에 “bc” 1개에서 5 사이

 

"hi|hello"

"hi" "hello" 들어 있는 문자열

(응용) "(b|cd)ef"

"bef" 또는 "cdef"

(응용) "(a|b)*c"

a b 섞여서 여러번 나타나고 그뒤에 c 붙어있는 패턴

 

. ()

임의의 문자

ex) "^.{3}$"        3문자로만 되어 있는 문자열

 

[] 괄호 안에 있는 내용 임의의 문자

[] 안에서 첫문자로 ^ 쓰면 괄호 내용의 부정 괄호 안에 포함되지 않는 문자

"[ab]"

a 또는 b  ("a|b" 동일한 표현)

"[a-d]"

소문자 'a'에서 'd'까지 ("a|b|c|d"또는 "[abcd]" 동일)

(응용) "^[a-zA-Z]"

영문자로 시작하는 문자열

(응용) "[0-9]%"

% 문자 앞에 하나의 숫자가 붙어 있는 패턴

(응용) "%[^a-zA-Z]%"

% 문자 사이에 영문자가 없는 패턴

 

특수 문자 자체를 검색하기 사용하기

\^

^

 

\.

.

\[

[

 

\$

$

\(

(

 

\)

)

\|

|

 

\*

*

\+

+

 

\?

?

\{

{

 

\\

\

\n

줄넘김문자

 

\r

리턴문자

\w

알파벳과 _ (밑줄)

 

\W

알파벳과 _ 아닌

\s

공간

 

\S

공간이 아닌

\d

숫자

 

\D

숫자가 아닌

\b

단어와 단어 사이의 경계

 

\B

단어 사이의 경계가 아닌

\t

Tab문자

 

\xnn

16진수 nn 해당하는 문자

 

[ ] 안에서는 특수 문자가 모두 효력을 잃게 됩니다.

 

검색 + 치환 위한 하부식(부분식)

( ) 둘러싼 부분은 각각 하나의 덩어리로 취급해서, 검색시 ( ) 안에 해당되는 내용들을 변경할 내용에서 그대로 가져다 이용 있습니다. 검색된 각각의 ( )안에 해당되는 내용은 변경할 내용에서 $1, $2, .. 등으로 지정해서 있습니다.

예제) mp3파일 이름 바꾸기

검색 : (.*) - (.*)\.mp3   .* 길이에 상관없이 임의의 문자열, \.

치환 : $2 - $1.mp3     앞에서 검색한 ( )안에 해당되는 내용끼리 순서 바꾸기

ex) "제목 - 연주자.mp3"  Þ "연주자 - 제목.mp3"

앞에서 정의한 하부식을 다시 활용하기 (제가 잘못 이해한 것일 수도 있는데)

\n ( ) 하부식 중에서 n번째 하부식 가리킵니다.

예제) (.+)\1+

\1 되어 있으니까 첫번째 부분식 (.+) 가리킵니다. 내용을 해석하자면, 일단 (.+) 있으니까 이에 해당되는 내용을 찾고, \1+ 있으니까 첫번째 부분식 (.+) 똑같은 내용이 뒤에 1 이상 있는 문자열을 찾습니다.

예제) abab같은 문자열이 위에 해당되는데, 일단 (.+) 임의의 문자열 ab 찾고 뒤에 \1+ 첫번째 부분식을 다시 1 이상 있는 것을 찾으니까 뒤의 ab 이에 해당합니다.

 

변경자 검색 방식 변경

(?i)

대소문자 무시 (기본값)

(?-i)

대소문자 구분

(?g)

"greedy" 모드로 전환 (기본값)

(?-g)

"greedy" 모드 해제, 따라서 "+" "+?" 동일한 것으로 인식

 

2007. 6. 29. 15:56

정규표현식 기초

정규표현식의 기본 문법

 

정규표현식은 소프트웨어에 따라서 방식이나 지원 범위가 다를 있습니다.

 

^The”

"The" 시작하는 문자열

"of despair$"

"of despair" 끝나는 문자열

"^abc$"

"abc" 시작하고 "abc" 끝나는 문자열 ("abc" 라는 문자열도 해당됨)

"notice"

"notice" 들어 있는 문자열

 

"ab*"

a 다음에 b 0 이상 ("a", "ab", "abbb", )

"ab+"

a 다음에 b 1 이상 ("ab", "abbb", )

"ab?"

a 다음에 b 있거나 없거나 (ab 또는 a)

 

"ab{2}"

a 다음에 b 2 있는 문자열 ("abb")

"ab{2,}"

a 다음에 b 2 이상 ("abb", "abbbb", .)

"ab{3,5}"

a 다음에 b 3개에서 5 사이 ("abbb", "abbbb", 또는 "abbbbb")

 

'*', '+', '?' 각각 "{0,}", "{1,}", "{0,1}" 같습니다.

 

( ) 문자열을 묶음 처리할 사용

"a(bc)*"

a 다음에 “bc” 0 이상 (묶음 처리)

"a(bc){1,5}"

a 다음에 “bc” 1개에서 5 사이

 

"hi|hello"

"hi" "hello" 들어 있는 문자열

(응용) "(b|cd)ef"

"bef" 또는 "cdef"

(응용) "(a|b)*c"

a b 섞여서 여러번 나타나고 그뒤에 c 붙어있는 패턴

 

. ()

임의의 문자

ex) "^.{3}$"        3문자로만 되어 있는 문자열

 

[] 괄호 안에 있는 내용 임의의 문자

[] 안에서 첫문자로 ^ 쓰면 괄호 내용의 부정 괄호 안에 포함되지 않는 문자

"[ab]"

a 또는 b  ("a|b" 동일한 표현)

"[a-d]"

소문자 'a'에서 'd'까지 ("a|b|c|d"또는 "[abcd]" 동일)

(응용) "^[a-zA-Z]"

영문자로 시작하는 문자열

(응용) "[0-9]%"

% 문자 앞에 하나의 숫자가 붙어 있는 패턴

(응용) "%[^a-zA-Z]%"

% 문자 사이에 영문자가 없는 패턴

 

특수 문자 자체를 검색하기 사용하기

\^

^

 

\.

.

\[

[

 

\$

$

\(

(

 

\)

)

\|

|

 

\*

*

\+

+

 

\?

?

\{

{

 

\\

\

\n

줄넘김문자

 

\r

리턴문자

\w

알파벳과 _ (밑줄)

 

\W

알파벳과 _ 아닌

\s

공간

 

\S

공간이 아닌

\d

숫자

 

\D

숫자가 아닌

\b

단어와 단어 사이의 경계

 

\B

단어 사이의 경계가 아닌

\t

Tab문자

 

\xnn

16진수 nn 해당하는 문자

 

[ ] 안에서는 특수 문자가 모두 효력을 잃게 됩니다.

 

검색 + 치환 위한 하부식(부분식)

( ) 둘러싼 부분은 각각 하나의 덩어리로 취급해서, 검색시 ( ) 안에 해당되는 내용들을 변경할 내용에서 그대로 가져다 이용 있습니다. 검색된 각각의 ( )안에 해당되는 내용은 변경할 내용에서 $1, $2, .. 등으로 지정해서 있습니다.

예제) mp3파일 이름 바꾸기

검색 : (.*) - (.*)\.mp3   .* 길이에 상관없이 임의의 문자열, \.

치환 : $2 - $1.mp3     앞에서 검색한 ( )안에 해당되는 내용끼리 순서 바꾸기

ex) "제목 - 연주자.mp3"  Þ "연주자 - 제목.mp3"

앞에서 정의한 하부식을 다시 활용하기 (제가 잘못 이해한 것일 수도 있는데)

\n ( ) 하부식 중에서 n번째 하부식 가리킵니다.

예제) (.+)\1+

\1 되어 있으니까 첫번째 부분식 (.+) 가리킵니다. 내용을 해석하자면, 일단 (.+) 있으니까 이에 해당되는 내용을 찾고, \1+ 있으니까 첫번째 부분식 (.+) 똑같은 내용이 뒤에 1 이상 있는 문자열을 찾습니다.

예제) abab같은 문자열이 위에 해당되는데, 일단 (.+) 임의의 문자열 ab 찾고 뒤에 \1+ 첫번째 부분식을 다시 1 이상 있는 것을 찾으니까 뒤의 ab 이에 해당합니다.

 

변경자 검색 방식 변경

(?i)

대소문자 무시 (기본값)

(?-i)

대소문자 구분

(?g)

"greedy" 모드로 전환 (기본값)

(?-g)

"greedy" 모드 해제, 따라서 "+" "+?" 동일한 것으로 인식