09 3월

도로명주소 API 서비스

도로명 주소 API 서비스

행정자치부에서 제공하는 OPEN API 서비스

 

API 신청페이지

https://www.juso.go.kr/addrlink/devAddrLinkRequestWrite.do?returnFn=write&cntcMenu=URL

 

PHP + Snoopy로 주소찾기 예제

코드


<?php
require_once 'Snoopy.class.php';

$params = array(
    'currentPage' => 1,
    'countPerPage' => 5,
    'resultType' => 'json',
    'confmKey' => '{발급받은 키문자열}',
    'keyword' => '서울시 마포구 합정동 10'
);

$snoopy = new Snoopy();
$snoopy->httpmethod = "POST";
$snoopy->submit("http://www.juso.go.kr/addrlink/addrLinkApiJsonp.do", $params);
$response = $snoopy->results;

// 앞뒤에 '(', ')' 문자를 제거한 뒤 json_decode()를 이용해 변환
$json = substr($response, 1, -1);
$obj = json_decode($json);

 

출력결과


stdClass Object
(
    [results] => stdClass Object
        (
            [common] => stdClass Object
                (
                    [errorMessage] => 정상
                    [countPerPage] => 5
                    [totalCount] => 73
                    [errorCode] => 0
                    [currentPage] => 1
                )

            [juso] => Array
                (
                    [0] => stdClass Object
                        (
                            [detBdNmList] => 
                            [engAddr] => 56, Tojeong-ro, Mapo-gu, Seoul
                            [rn] => 토정로
                            [emdNm] => 합정동
                            [zipNo] => 04082
                            [roadAddrPart2] =>  (합정동)
                            [sggNm] => 마포구
                            [jibunAddr] => 서울특별시 마포구 합정동  55-1
                            [siNm] => 서울특별시
                            [roadAddrPart1] => 서울특별시 마포구 토정로 56
                            [bdNm] => 
                            [admCd] => 1144012200
                            [udrtYn] => 0
                            [lnbrMnnm] => 55
                            [roadAddr] => 서울특별시 마포구 토정로 56 (합정동)
                            [lnbrSlno] => 1
                            [buldMnnm] => 56
                            [bdKdcd] => 0
                            [liNm] => 
                            [rnMgtSn] => 114403113023
                            [mtYn] => 0
                            [bdMgtSn] => 1144011800100010000009632
                            [buldSlno] => 0
                        )

                    [1] => stdClass Object
                        (
                            [detBdNmList] => 
                            [engAddr] => 35, Tojeong-ro 4-gil, Mapo-gu, Seoul
                            [rn] => 토정로4길
                            [emdNm] => 합정동
                            [zipNo] => 04085
                            [roadAddrPart2] =>  (합정동, 신성빌라)
                            [sggNm] => 마포구
                            [jibunAddr] => 서울특별시 마포구 합정동  75-10 신성빌라
                            [siNm] => 서울특별시
                            [roadAddrPart1] => 서울특별시 마포구 토정로4길 35
                            [bdNm] => 신성빌라
                            [admCd] => 1144012200
                            [udrtYn] => 0
                            [lnbrMnnm] => 75
                            [roadAddr] => 서울특별시 마포구 토정로4길 35 (합정동, 신성빌라)
                            [lnbrSlno] => 10
                            [buldMnnm] => 35
                            [bdKdcd] => 1
                            [liNm] => 
                            [rnMgtSn] => 114404139606
                            [mtYn] => 0
                            [bdMgtSn] => 1144012200100750010024923
                            [buldSlno] => 0
                        )

                    [2] => stdClass Object
                        (
                            [detBdNmList] => 
                            [engAddr] => 13-5, Tojeong-ro 4an-gil, Mapo-gu, Seoul
                            [rn] => 토정로4안길
                            [emdNm] => 합정동
                            [zipNo] => 04085
                            [roadAddrPart2] =>  (합정동)
                            [sggNm] => 마포구
                            [jibunAddr] => 서울특별시 마포구 합정동  82-10
                            [siNm] => 서울특별시
                            [roadAddrPart1] => 서울특별시 마포구 토정로4안길 13-5
                            [bdNm] => 
                            [admCd] => 1144012200
                            [udrtYn] => 0
                            [lnbrMnnm] => 82
                            [roadAddr] => 서울특별시 마포구 토정로4안길 13-5 (합정동)
                            [lnbrSlno] => 10
                            [buldMnnm] => 13
                            [bdKdcd] => 0
                            [liNm] => 
                            [rnMgtSn] => 114404139607
                            [mtYn] => 0
                            [bdMgtSn] => 1144012200100820010012210
                            [buldSlno] => 5
                        )

                    [3] => stdClass Object
                        (
                            [detBdNmList] => 
                            [engAddr] => 19, Tojeong-ro 4an-gil, Mapo-gu, Seoul
                            [rn] => 토정로4안길
                            [emdNm] => 합정동
                            [zipNo] => 04085
                            [roadAddrPart2] =>  (합정동)
                            [sggNm] => 마포구
                            [jibunAddr] => 서울특별시 마포구 합정동  82-10
                            [siNm] => 서울특별시
                            [roadAddrPart1] => 서울특별시 마포구 토정로4안길 19
                            [bdNm] => 
                            [admCd] => 1144012200
                            [udrtYn] => 0
                            [lnbrMnnm] => 82
                            [roadAddr] => 서울특별시 마포구 토정로4안길 19 (합정동)
                            [lnbrSlno] => 10
                            [buldMnnm] => 19
                            [bdKdcd] => 0
                            [liNm] => 
                            [rnMgtSn] => 114404139607
                            [mtYn] => 0
                            [bdMgtSn] => 1144012200100820010024925
                            [buldSlno] => 0
                        )

                    [4] => stdClass Object
                        (
                            [detBdNmList] => 
                            [engAddr] => 13-4, Tojeong-ro 4an-gil, Mapo-gu, Seoul
                            [rn] => 토정로4안길
                            [emdNm] => 합정동
                            [zipNo] => 04085
                            [roadAddrPart2] =>  (합정동)
                            [sggNm] => 마포구
                            [jibunAddr] => 서울특별시 마포구 합정동  82-10
                            [siNm] => 서울특별시
                            [roadAddrPart1] => 서울특별시 마포구 토정로4안길 13-4
                            [bdNm] => 
                            [admCd] => 1144012200
                            [udrtYn] => 0
                            [lnbrMnnm] => 82
                            [roadAddr] => 서울특별시 마포구 토정로4안길 13-4 (합정동)
                            [lnbrSlno] => 10
                            [buldMnnm] => 13
                            [bdKdcd] => 0
                            [liNm] => 
                            [rnMgtSn] => 114404139607
                            [mtYn] => 0
                            [bdMgtSn] => 1144012200100820010012213
                            [buldSlno] => 4
                        )

                )

        )

)

07 12월

ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION

untitled-1

ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION

어느날 갑자기 다운로드가 되지 않고 이런 오류메시지가 나와서 알아보니 크롬 최신버전에서 헤더가 변경되었다한다.

아래처럼 변경 (PHP)

Header(“Content-Disposition: attachment; filename=$filename”);

Header(“Content-Disposition: attachment; filename=\”$filename\”“);

파일명을 쌍따옴표로 묶어준다.

06 12월

PHP – HTML DOM 파서

Simple Html DOM Parser

http://sourceforge.net/projects/simplehtmldom/

C#의 Html Agility Pack(https://htmlagilitypack.codeplex.com/)같이 PHP에서 사용이 가능한 DOM 파서가 필요해 구글링을 해보니 Simplehtmldom 이라는 좋은 라이브러리가 있었다.

네이버 연합뉴스의 제목만 가져오기

$html = file_get_html('http://news.naver.com/main/list.nhn?mode=LPOD&mid=sec&oid=422&listType=title');
foreach($html->find('.list_body .type02 a') as $e) {
    echo $e->innertext;
}

다음 연령별 뉴스의 모든 노드를 출력

$html = file_get_html('http://media.daum.net/ranking/age/');
$dump = dump_html_tree($html);
echo "<xmp style='text-align: left;'>";
print_r($dump);
echo "</xmp>";
15 11월

Google reCAPTCHA PHP (CURL/Snoopy) Sample

logo_recaptcha_color_24dp Google reCAPTCHA

입력폼

<form onsubmit="return check_form()">
    <input type="hidden" id="recaptcha_response" name="recaptcha_response" value="" />
    <div id="recaptcha1"></div>
    <button type="submit">확인</button>
</form>
<script type="text/javascript">
var recaptchaWidger1;
var onloadCallback = function() {
recaptchaWidger1 = grecaptcha.render('recaptcha1', {
'sitekey' : '{Site key}'
});
};
</script>
<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>

<script>
function check_form() {
    var recaptch_response = grecaptcha.getResponse(recaptchaWidger1);
    if (!recaptch_response) {
        alert("자동가입방지 문자를 확인해 주세요");
        return false;
    }

    document.getElementById("recaptcha_response").value = recaptch_response;

    return true;
}
</script>

폼데이터 처리(1) – Snoopy.lib.php

include_once 'Snoopy.class.php';
$snoopy = new Snoopy;
$data = array(
    "secret" => "Secret key",
    "response" => $_POST['recaptcha_response']
);
$snoopy->submit('https://www.google.com/recaptcha/api/siteverify', $data);
$response = json_decode($snoopy->results);
if (!$response->success) {
    exit("fail message");
}

폼데이터 처리(2) – CURL

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.google.com/recaptcha/api/siteverify");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "secret={Secret key}&response=".$_POST['recaptcha_response']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec ($ch);
curl_close ($ch);
$response = json_decode($output);
if (!$response->success) {
    exit("fail message");
}
23 7월

C#, PHP – RIJNDAEL 256bit 암/복호화

C#과 php간에 데이터를 주고 받아야 하는데
평문으로 통신하기에 무리가 있던 도중
기존에 사용하던 php 암호화 라이브러리와 연동되는 c# 코드를 발견~
살짝 수정해서 사용하는데 무리가 없음

기본은 128bit지만 256bit로 변경했음
php의 경우 블록에서 남는 부분을 zero로 채워넣기 때문에
c#에서 PaddingMode.Zeros를 설정해야 정상적으로 동작합니다.

Encryption.cs

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace TestClass
{
    class Encryption
    {
        private static byte[] rijnKey = Encoding.UTF8.GetBytes("abcdefg_abcdefg_");
        private static byte[] rijnIV = Encoding.UTF8.GetBytes("abcdefg_");

        public static String EncryptIt(String s)
        {
            String result;
            RijndaelManaged rijn = new RijndaelManaged();
            rijn.Mode = CipherMode.ECB;
            rijn.Padding = PaddingMode.Zeros; // php와의 연동에서 꼭 확인
            rijn.BlockSize = 256;

            using (MemoryStream msEncrypt = new MemoryStream())
            {
                using (ICryptoTransform encryptor = rijn.CreateEncryptor(rijnKey, rijnIV))
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                        {
                            swEncrypt.Write(s);
                        }
                    }
                }
                result = Convert.ToBase64String(msEncrypt.ToArray());
            }
            rijn.Clear();

			result = Base64UrlEncode(result);

			return result;
        }

        public static String DecryptIt(String s)
        {
            String result;
            RijndaelManaged rijn = new RijndaelManaged();
            rijn.Mode = CipherMode.ECB;
            rijn.Padding = PaddingMode.Zeros;
            rijn.BlockSize = 256;

            s = Base64UrlDecode(s);

            using (MemoryStream msDecrypt = new MemoryStream(Convert.FromBase64String(s)))
            {
                using (ICryptoTransform decryptor = rijn.CreateDecryptor(rijnKey, rijnIV))
                {
                    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (StreamReader swDecrypt = new StreamReader(csDecrypt))
                        {
                            result = swDecrypt.ReadToEnd();
                        }
                    }
                }
            }
            rijn.Clear();

            return result;
        }

        public static string Base64UrlEncode(string arg)
        {
            arg = arg.Split('=')[0]; // Remove any trailing '='s
            arg = arg.Replace('+', '-'); // 62nd char of encoding
            arg = arg.Replace('/', '_'); // 63rd char of encoding
            return arg;
        }

        public static string Base64UrlDecode(string arg)
        {
            string s = arg;
            s = s.Replace('-', '+'); // 62nd char of encoding
            s = s.Replace('_', '/'); // 63rd char of encoding
            switch (s.Length % 4) // Pad with trailing '='s
            {
                case 0: break; // No pad chars in this case
                case 2: s += "=="; break; // Two pad chars
                case 3: s += "="; break; // One pad char
                default:
                    throw new System.Exception("Illegal base64url string!");
            }
            return s;
        }
    }
}

test.php

&amp;lt;?php
//Encryption function
function encryption($encrypt, $key, $iv)
{
    $td = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_ECB, '');
    mcrypt_generic_init($td, $key, $iv);
    $encrypted = mcrypt_generic($td, $encrypt);
    $encode = base64_encode($encrypted);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);

	return $encode;
}


//Decryption function
function decryption($decrypt, $key, $iv)
{
    $decoded = base64safeDecode($decrypt);
    $decoded = base64_decode($decoded);
    $td = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_ECB, '');
    mcrypt_generic_init($td, $key, $iv);
    $decrypted = mdecrypt_generic($td, $decoded);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);

    return trim($decrypted);
}

function base64safeDecode($data) {
	$data = str_replace("-", "+", $data);
	$data = str_replace("_", "/", $data);

	switch (strlen($data) % 4) {
		case 0: break;
		case 1: $data .= "=="; break;
		case 2: $data .= "="; break;
	}

	return $data;
}

$key = "abcdefg_abcdefg_";
$iv = "abcdefg_";

echo encryption("Hello world!", $key, $iv);
echo decryption("1ERpu8RaiyMqsXdjhCEu9IVMyQlz/A3fBR6vGbNxaVs=", $key, $iv);
?&amp;gt;
12 3월

screw 로 php 소스코드 암호화

php_screw 설치

php_screw 설치하기를 참고하여 php_screw.so를 익스텐션에 올린다

 

screw 컴파일

php_screw 소스를 압축해제한 디렉토리에 tools가 있다
cd tools
make

screw 컴파일

실행파일을 접근가능한 디렉토리로 복사해준다. 여기서는 /usr/bin/ 으로 복사했다
cp screw /usr/bin

 

php 파일 암호화

테스트할 파일을 만든다
echo "" > phpinfo.php

암호화한다
screw phpinfo.php

php_screw

위에처럼 phpinfo.php, phpinfo.php.screw 파일이 생성된다
phpinfo.php 는 암호화 되었고
phpinfo.php.screw 는 원본파일이다

12 3월

php_screw 를 활용한 php 소스 코드 암호화하는 방법

0. 환경

운영체제 Ubuntu 12.04 LTS (우분투 설치 안내)
php설치
apt-get install php5 php5-dev php-common

 

1. 소스코드 다운로드

http://sourceforge.net/projects/php-screw/files/

캡처

최신버전을 다운로드 하는데,
본글에서는 screw 1.5버전을 기준으로 설명되었습니다.

[php_screw-1.5.tar.gz]
http://sourceforge.net/projects/php-screw/files/latest/download?source=files

 

2. 서버에서 screw 를 다운로드하고 압축을 해제합니다.

wget http://sourceforge.net/projects/php-screw/files/latest/download?source=files
tar xfzp php_screw-1.5.tar.gz
cd php_screw-1.5

 

3. my_screw.h 수정

SEED를 변경합니다.
screw 에서 키값은 암호화/복호화시 사용되므로 아주 중요합니다.
암호화시 사용한 SEED를 이용해 복호화를 하므로 SEED가 다른 소스로 암호화된 소스는 처리가 안됩니다.
vim my_screw.h

short pm9screw_mycryptkey[] = {
11152, 368, 192, 1281, 62
};

적절하게 아래처럼 변경(아래처럼 변수를 늘려도 됨)

short pm9screw_mycryptkey[] = {
12311, 312, 4422, 534, 11, 849, 125
};

 

4. 컴파일

phpize
./configure
make
make install

4.1 컴파일 오류
/usr/local/src/php_screw-1.5/php_screw.c:124:2: error: 'struct _zend_compiler_globals' has no member named 'extended_info'
/usr/local/src/php_screw-1.5/php_screw.c: In function 'zm_shutdown_php_screw':
/usr/local/src/php_screw-1.5/php_screw.c:133:2: error: 'struct _zend_compiler_globals' has no member named 'extended_info'
/usr/local/src/php_screw-1.5/php_screw.c: In function 'pm9screw_compile_file':
/usr/local/src/php_screw-1.5/php_screw.c:81:7: warning: ignoring return value of 'fread', declared with attribute warn_unused_result [-Wunused-result]
/usr/local/src/php_screw-1.5/php_screw.c: In function 'pm9screw_ext_fopen':
/usr/local/src/php_screw-1.5/php_screw.c:36:7: warning: ignoring return value of 'fread', declared with attribute warn_unused_result [-Wunused-result]
make: *** [php_screw.lo] Error 1

위와 같은 오류가 발생할 경우 php_screw.c 파일의 마지막줄에 CG(extended_info) = 1; 줄을 주석처리해준다

PHP_MINIT_FUNCTION(php_screw)
{
//CG(extended_info) = 1;
org_compile_file = zend_compile_file;
zend_compile_file = pm9screw_compile_file;
return SUCCESS;
}
PHP_MSHUTDOWN_FUNCTION(php_screw)
{
//CG(extended_info) = 1;
zend_compile_file = org_compile_file;
return SUCCESS;
}

 

4. so 파일 복사

php5 extension 모듈이 있는 폴더에 복사해준다
cp modules/php_screw.so /usr/lib/php5/20100525/

extension 모듈 디렉토리 위치를 모르는 경우 아래와 같이 확인을 할 수 있다
php -i | grep extension_dir

 

5. php.ini에 php_screw.so 추가

cd /etc/php5/mods-available
echo "extension=php_screw.so" > screw.ini
cd /etc/php5/conf.d
ls -s ../mods-available/screw.ini 90-screw.ini

상황에 따라서 php.ini 파일에 직접 extension=php_screw.so 를 적어주어도 된다.

 

6. apache 웹서버 재시작

/etc/init.d/apache2 restart

 

7. screw 설치확인

php -i | grep screw

php_screw 설치확인

20 9월

mysql strip_tags

delimiter ||

DROP FUNCTION IF EXISTS strip_tags||
CREATE FUNCTION strip_tags( x longtext) RETURNS longtext
LANGUAGE SQL NOT DETERMINISTIC READS SQL DATA
BEGIN
DECLARE sstart INT UNSIGNED;
DECLARE ends INT UNSIGNED;
SET sstart = LOCATE(‘<‘, x, 1);
REPEAT
SET ends = LOCATE(‘>’, x, sstart);
SET x = CONCAT(SUBSTRING( x, 1 ,sstart -1) ,SUBSTRING(x, ends +1 )) ;
SET sstart = LOCATE(‘<‘, x, 1);
UNTIL sstart < 1 END REPEAT;
return x;
END;
||
delimiter ;

25 6월

구글 Picasa 웰앨범으로 이미지 호스팅 하기

GData API로 구글 Picasa 웹앨범을 이미지호스팅처럼 사용할 수 있습니다.

구글 Picasa 웹앨범은 기본 1G를 제공하며,
20GB($5.00 USD/년), 80GB($20.00 USD/년), 200GB($50.00 USD/년), 400GB($100.00 USD/년), 1TB($256.00 USD/년)
옵션을 제공하기 때문에 쓸만합니다.

대책없는 트래픽을 유발하는 사진, 중고장터 등의 게시판에 적용하면 상당히 유용할 듯 합니다.

업로드하면 이미지를 가져오는 것은 직접링크기 때문에 빠릅니다.
서버에서 직접 보여주는 것과 차이가 없습니다.

[장점]
1. 싸다.(ㅡ_ㅡa).. 트래픽 제한이 없는 것 같습니다. 못 찾겠습니다;; 따라서 무지 싼겁니다.
2. 어느 웹에디터든지 적용이 가능하리라 봅니다. 본문은 cheditor4를 기준으로 작성되었습니다.
3. 구글신께서 서버 내리는 날 전세계 인터넷 재앙이 올겁니다. 망할리 없죠?? 저장공간에 대한 신뢰도 역시 중요합니다.

[단점]
1. 이미지 업로드/삭제 등 API를 이용한 작업시 Delay가 있습니다.
2. Zend, PHP5 요구
3. Zend 이름만 들어본 저같은 사람은 메뉴얼삽질+시간이 필요합니다.

테스트URL : http://picasa.webiz.kr (접속이 안될경우 DNS 캐쉬 refresh 후 시도)

========================================================================
1. 파일(백업필수!!)

(설치Path)/lib 복사
 – gdata.lib.php

(설치Path)/cheditor4 덮어쓰기
 – imageupload-class.php
 – insert_image.php
 – insert_image_form.php

(설치Path)/ 복사(아무대나 해도 됨. 앨범아이디 확인용)
 – picasa_album_list.php

========================================================================
2. 준비하기

GData API는 Zend Framework에 포함되어 있습니다.
따라서 Zend Framework가 설치되어 있다면 정말 쉽습니다.

Zend Framework가 설치되어 있지 않다면 http://code.google.com/intl/ko/apis/gdata/articles/php_client_lib.html 페이지를 참고하셔서 설치해 주시면 됩니다.

PHP 5.1.4 이상, OpenSSL이 설치되어 있어야 한다고 나와 있습니다.

꼭 참고할 페이지
http://code.google.com/intl/ko/apis/gdata/docs/developers-guide.html
http://code.google.com/intl/ko/apis/gdata/articles/php_client_lib.html
http://code.google.com/intl/ko/apis/picasaweb/docs/1.0/developers_guide_php.html

========================================================================
3. 구글계정만들기

Pacasa 웹앨범을 이용하기 위해서는 구글계정이 필요합니다.
적당히 하나 만들어 줍니다.

업로드용으로 사용할 앨범을 만들기 위해서 http://picasaweb.google.com/home 로 이동합니다.
상단 버튼중 [업로드] 버튼 클릭, [새 앨범을 만드세요] 클릭 후
제목, 설명 등을 입력한 뒤, 공유탭에서 비공개로 변경하여 생성합니다.
ActiveX는 설치하실 필요는 없습니다.

========================================================================
4. 앨범아이디 확인

picasa_album_list.php 파일에서 아래부분을 에디터로 수정합니다.
12: $user = “아이디@gmail.com“;
13: $pass = “비밀번호”;

파일을 웹브라우저로 확인해보면 Picasa 웹앨범에서 존재하는 모든 앨범이
앨범명(album: 앨범아이디(숫자))로 출력됩니다.
사용할 앨범아이디(숫자)를 카피해둡니다.

========================================================================
5. /cheditor4/insert_image.php 수정

12: $attach->gdata[‘user’] = “아이디@gmail.com“;
13: $attach->gdata[‘pass’] = “비밀번호”;
14: $attach->gdata[‘albumId’] = “앨범아이디(숫자)”;

========================================================================
6. 마침

gdata.lib.php 파일에는 사진 업로드/삭제 코드만 있지만
가이드/샘플파일을 참고하면 앨범 추가/삭제, 태그 추가/삭제 등 할 수 있는게 더 있습니다.

그누보드 4.32.03 (euc-kr) 버전으로 테스트 했습니다.
그러나 그누보드관련 파일을 수정하지 않았고,
cheditor4만 수정했기 때문에 cheditor4 버전에 따라 오류가 발생할 수 있습니다.

수정한 파일에 따로 주석을 달아 놓지는 않았습니다.

본 파일로 인한 오류/피해는 책임 안집니다 ㅡ_ㅡ^

반드시 테스트 후 적용하시길 바랍니다

16 6월

정규식 테스트

<?
 /**
  * 정규식 테스트
  * PHPSCHOOL TIP&TECH 게시판 제목만 가져오기
  */


 // 게시판 글 가져오기
 $fp = fopen(“http://phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&page=1“, “r”);
 while(!feof($fp)) {
  $str .= fgets($fp, 1024);
 }
 fclose($fp);


 // 제목부분만 $matches에 저장
 preg_match_all(“/(<span style=”)(.*)(<\/span>)/”, $str, $matches);
 
 // 필요없는 부분 제거
 $tmp = str_replace(“<span style=”>”, “”, $matches[0]);
 $tmp = preg_replace(“/(<\/span>)(.*)/”, “”, $tmp);


 // 출력하면서 영문,숫자부분에 링크
 foreach($tmp as $v) {
  echo preg_replace(“/([A-Za-z0-9]([A-Za-z0-9]*)[A-Za-z0-9])/”, “<a href=’$1′>$1</a>”, $v).”<BR>”;
 }
?>