홈으로 | 무료회원가입 | 아이디/비번찾기
추천음악방송
[php] 알아두면 편한 정규표현식
8년 전
태터플러그인중의 하나인데 먼지는 모르겠습니다. ㅡㅡㅋ
// 글의 preview 이미지 가져오기
function getMPrvImg($content)
{
        $img = "";
        preg_match("/(\[##_.*\||<\/?img.*src=.)(.*)(>|\|.*_##\])/Ui", $content, $imgTag);
        if($imgTag) {
                if( stristr($imgTag[1], "[##_") ) {
                        preg_match("/.*\.(jp[e]?g|gif|png)/Ui", $imgTag[2], $imgName);
                        $img = $imgName[0];
                } elseif( stristr($imgTag[2], "http://") ) {
                        preg_match("/http:\/\/.*\.(jp[e]?g|gif|png)/Ui", $imgTag[2], $imgName);
                        $img = $imgName[0];
                } elseif( stristr($imgTag[2], "[##_ATTACH_PATH_##]") ) {
                        preg_match("/\/(.*\.(jp[e]?g|gif|png))/Ui", $imgTag[2], $imgName);
                        $img = $imgName[1];
                }
        }
        return $img;
}

// 글 내용의 태그 정리
function stripMHTML($text, $allowTags=array())
{
        $text = preg_replace('/<(script|style)[^>]*>.*?<\/\1>/si','',$text);
        if(count($allowTags) == 0)
                $text = preg_replace('/<[\w\/!]+[^>]*>/','',$text);
        else {
                preg_match_all('/<\/?([\w!]+)[^>]*?>/s',$text,$matches);
                for($i=0; $i<count($matches[0]); $i++) {
                        if(!in_array(strtolower($matches[1][$i]),$allowTags))
                                $text = str_replace($matches[0][$i],'',$text);
                }
        }
        $text = preg_replace('/ ?|\xc2\xa0\x20/',' ',$text);
        $text = trim(preg_replace('/\s+/',' ',$text));
        $text = preg_replace('/\[#M_[^|]*\|[^|]*\|/Us','',str_replace('_M#]','',preg_replace('/\[##_.+_##\]/Us','',$text)));
        $text = preg_replace('@(<s_|</s_)[0-1a-zA-Z_]+>@','',$text);
        $text = preg_replace('/<\?xml.*\/>/Ui','',$text);
        if(!empty($text))
                $text = str_replace(array(''',''','"'),array('\'','\'','"'),$text);
        return $text;
}


특수문자 없애는 정규표현식
$string = preg_replace ("/[ #\&\+\-%@=\/\\\:;,\.'\"\^`~\_|\!\?\*$#<>()\[\]\{\}]/i", "",  $string);


제로보드에서 쓰는 정규식
// E-mail 주소가 올바른지 검사
function ismail( $str ) {
        if( eregi("([a-z0-9\_\-\.]+)@([a-z0-9\_\-\.]+)", $str) ) return $str;
        else return '';
}

// E-mail 의 MX를 검색하여 실제 존재하는 메일인지 검사 (덤......)
function mail_mx_check($email) {
        if(!ismail($email)) return false;
        list($user, $host) = explode("@", $email);
        if (checkdnsrr($host, "MX") or checkdnsrr($host, "A")) return true;
        else return false;
}

// 홈페이지 주소가 올바른지 검사
function isHomepage( $str ) {
        if(eregi("^http://([a-z0-9\_\-\./~@?=&-\#{5,}]+)", $str)) return $str;
        else return '';
}

// URL, Mail을 자동으로 체크하여 링크만듬
function autolink($str) {
        // URL 치환
        $homepage_pattern = "/([^\"\'\=\>])(mms|http|HTTP|ftp|FTP|telnet|TELNET)\:\/\/(.[^ \n\<\"\']+)/";
        $str = preg_replace($homepage_pattern,"\\1<a href=\\2://\\3 target=_blank>\\2://\\3</a>", " ".$str);

        // 메일 치환
        $email_pattern = "/([ \n]+)([a-z0-9\_\-\.]+)@([a-z0-9\_\-\.]+)/";
        $str = preg_replace($email_pattern,"\\1<a href=mailto:\\2@\\3>\\2@\\3</a>", " ".$str);

        return $str;
}


한글이 포함되어 있는지 검사
$str = "This is 한글" ;
if(preg_match("/[\xA1-\xFE][\xA1-\xFE]/", $str)) { //true면 한글포함 false 한글 미포함
        echo "한글포함";
} else {
        echo "한글미포함";
}



간단한 정리
1.ereg(정규표현식, 검색대상 문자열, [배열변수])
검색 대상 문자열에서 정규 표현식으로 나타낸 패턴과 일치하는 문자열이 발견되면 true를, 발견되지 않으면 false 반환

배열변수를 지정한 경우 : 검색 결과를 변수에 배열로 저장한다.
$string="2001-3-21";
ereg("([0-9]{4}) - ([0-9]{1,2}) - ([0-9]{1,2})" , $string, $regs)
$regs[0]= 2001-3-21  //첫번째 배열에는 조건 만족하는 문자열 저장
$regs[1]= 2001
$regs[2]=3
$regs[3]=21


2.eregi(정규표현식, 검색대상 문자열, [배열변수])
ereg() 함수와 동일한 기능을 수행하나, eregi() 함수는 대소 문자를 구분하지 않는다.

3.ereg_replace(정규표현식, 바꿀문자열, 원래문자열)
검색 대상 문자열에서 정규표현식으로 나타낸 패턴과 일치하는 문자열을 찾아 지정한 문자열로 바꾼다.

$string = "By viewing these pages";
$result  = ereg_replace("these", "those", $string)
.바꿀문자열: 정규표현식에서 가져다 쓸 수 있다.
                \\숫자 ( 정규표현식의 숫자 번째 괄호 안의 문자가 저장된다)

ex)
$string="By viewing these pages";
$result1=ereg_replace("(t[[:alpha:]]+)", "that", $string);       // By viewing that pages
$result2=ereg_replace("(t[[:alpha:]]+)"," \\1" , $string);     //By viewing these pages
$result3=ereg_replace("t([[:alpha:]]+)"," \\1" ,  $string);     //By viewing hese pages
$result4=ereg_replace("t([[:alpha:]]+)","that\\1",$string);      //By viewing thathese pages
$result5=ereg_replace("t([[:alpha:]]+) ([a-z]+s$)", "\\1" , $string);     //By viewing hese
$result6=ereg_replace("t([[:alpha:]]+) ([a-z]+s$)", "\\2" ,  $string);    //By viewing pages


4.eregi_replace(정규표현식, 바꿀문자열, 원래문자열)
검색 대상 문자열에서 정규표현식으로 나타낸 패턴과 일치하는 문자열을 찾아 지정한 문자열로 바꾼다.
이때 대소 문자는 구분하지 않는다.

5.split (정규표현식, 문자열)
정규표현식으로 나타낸 패턴과 일치하는 문자열을 구분자로 하여 이 구분자를 경계로 문자열을 나누어 배열에 저장한다.
explode() 함수는 특정 문자를 구분자로 사용하는 반면, splite() 함수는 정규 표현식을 구분자로 사용하므로
문자열을 좀 더 자유롭게 나눌 수 있다.
$mimbers=" 이완철 김영미      길현수  강현민";  //원소 사이의 간격이 일정치 않으므로 " "을 구분자로 사용할 수 없다.
$a = split("[[:space:]]+", $members)  // $a[0]=이완철  $a[1]=김영미  $a[2]=길현수  a[3]=강현민 //하나 이상의 공백 문자를 경계로 나눈다.

6.preg_match(정규표현식, 문자열)
ereg()함수와 비슷한 기능으로, 문자열이 정규표현식에 일치하면 true 아니면 false 반환
preg_match("/php/i", "PHP is the web scripting")
//정규표현식은 / 나  : 로 감싸준다.
//정규표현식 뒤에 i를 옵션으로 붙여주면 대소문자를 구분하지 않는다.

7.preg_replace(정규표현식, 바꿀문자열, 원래문자열, 바꿀문자개수)
ereg_replace()는 문자열을 전부 변경하는데 반하여 preg_replace()를 쓰면 변경할 문자의 개수를 지정할 수 있다.


정규표현식 (Regular 예pression)
정규표현식은 문자열의 일정한 패턴을 찾던지 치환하여 주는 기능을 가지고 있다.
메일 주소검사라던지, 소수점 몇째자리 까지 끊어서 보여주기 등.. 더욱더 복잡한
문자열도 이 정규표현식으로 처리할수 있다....
이는 프로그램시에 많은 일을 쉽게 처리하여 준다 (대부분 내장함수에도 있네요...)
특히 웹에서는 폼값을 처리할때 특정폼의 형식이 원하는 형식에 맞는지 검사할때
많이 쓰일수 있다. 정규표현식은 거의 모든 언어에서 지원하지만 사용법은 조금씩
다르다. 하지만 크게 다르지 않으므로 익혀놓으면 많은 도움이 되리라 생각된다.

**아래의 글은 몇가지 문서를 참고하였으며 정규표현식의 모든것을 포함하지는
않는다. (기본은 phpbuilder.com의 컬럼란의 내용이다)
============================================
편의상 반말을 한것에 대하여 양해를 구합니다.
============================================

정규표현식은 보통 eregi, eregi_replace, ereg, ereg_replace, 또는 perl 의 함수패턴을
그대로 사용할수 있도록 해놓은 함수 preg_match, preg_split, preg_quote 등의 함수
를 사용한다. (아마 perg 는 php 버전이 3.0.9 이상에서 사용가능할겁니다)

예) 사과라는 문자열을 배라는 문자열로 치환한다.
$string ="이것은 사과 입니다";
ereg_replace("사과","배",$string);

1. ^ 와 $ 의 사용의 예
'^' 는 바로 문자뒤의 문자열로 시작 됨을 가르킨다.
"^The" : 는 "The"로 시작 하는 문자를 말한다.
'$' 는 문자열의 맨 마지막을 가르킨다.
"of despair$" : 는 "of despair"로 끝나는 문자열이다.
"^abc$" : 는 hello로 시작해 hello로 끝나는 경우 이므로 "abc" 만 해당된다..

2. '.' '*' '+' '?' 의 사용법
'.' 은 어떤 문자든지 임의의 한문자를 말한다.꼭 하나의 문자가 있어야 한다.
예) "x.z" 는 xyz, xxz, xbz 등이고 xz난 xyyz는 안된다.
'*' 는 바로 앞의 문자가 없거나 하나 이상의 경우를 말한다.
예) "ab*" 는 a, abc, ab, abbbb 등을 말한다.
'+' 는 바로 앞의 문자를 나타내면 꼭 1나 이상이어야 한다.
예) "ab+" 는 abc, abbb 등이고 a는 되지 않는다.
'?' 는 바로 앞의 한문자가 있거나 없는것을 말한다. 단지 한문자 만이어야 한다.
예) "ab?" 는 a 또는 ab 를 나타낸다.

3. [], {} 와 () 그리고 |
3-1 '[]' 는 [] 안에 존재하는 문자들중 한 문자만을 나타낸다.
예) [abc] 는 a 또는 b 또는 c 중에 한문자를 나타낸다. 여기서 '-'를 사용할땐 범위를 나타낸다.
즉 [ a-f ] 는 [abcdf] 와 같은것을 나타낸다.
문자클래스 오퍼레이터라는 것에 대해 잠시..
유사한 성격의 문자들을 사용자가 알아보기 쉽게 단어로 그룹을 지었다고 보면 된다.

alnum : 알파벳과 숫자
alpha : 알파벳
blank : 스페이스나 탭 (시스템에 의존적임)
cntrl : 아스키코드에서의 127 이상의 문자와 32 이하의 제어문자
(한글의 첫째바이트가 127 이상이므로 제어문자로 취급됨 :()
digit : 숫자
graph : 스페이스는 제외되고 나머지는 'print' 항목과 같음.
lower : 소문자
print : 아스키코드에서 32에서 126까지의 찍을 수 있는 문자
punct : 제어문자도 아니고 알파벳.숫자도 아닌 문자
space : 스페이스, 케리지 리턴, 뉴라인, 수직 탭, 폼피드
upper : 대문자
xdigit : 16진수, 0-9, a-f, A-F

[[:alnum:]]은 [a-zA-Z0-9] 와 같은 의미다.
[[:alpha:]]은 [a-zA-Z] 와 같은 의미다.
문자열 오퍼레이터는 [] 사이에서만 효력을 발휘한다.
그리고 반대의 의미도 가능하다.
[^[:alnum:]] 은 알파벳과 숫자의 조합이 아닌것을 말한다.
[^a-zA-Z0-9] 와 같이 사용될수도 있다.

'3-2 {}'는 {} 앞에 있는 문자나 문자열의 개수를 정하는 것이다.
예) "ab" 는 "abb"를 나타낸다. 즉 b의 개수가 2개를 나타낸다.
"ab{2,}" 는 abb, abbbbb 등 b의 개수가 2개 이상을 나타낸다.
"ab{3,5}" 는 abbb, abbbb, abbbbb 와 같이 b가 3개에서 5개 까지를 나타낸다.

3-3 '()' 는 ()안에 있는 글자들을 그룹화 한다.
예) a(bc)* 는 a, abc abcbc 등 'bc'가 없거나 하나 이상인 경우이다.
"a(bc)" 는 abcbc 를 나타낸다.

3-4 '|' 는 OR 연산자 기능을 한다.
"a|b" 는 a 또는 b 둘중 하나를 나타낸다.
참고할것은 기호인데 이것은 . (, ) 등 단지 다음에 오는것이 문자라는것을
의미한다. 어떤한 처리도 없이 문자로만 인식한다.
{1,3} 하고 하면 {1,3} 와는 다르다.

4. 기초 활용
"a(bc)*" 는 a라는 문자를 포함하고 bc라는 문자열이 없거나 계속반복되는 문자열이다.
이것은 a, abc ,abcbc abcbcbc.... 등의 문자열을 의미한다.
"a(bc){1,5}" 는 a 라는 문자를 포함하고 bc 라는 문자를 묶은 형태인데. bc 라는 문자가
한번에서 5번까지를 말한다. --말이 더 어렵다....
이것은 abc,abcbc,abcbc,abcbcbc,abcbcbcbc,abcbcbcbcbc 의 문자열을 의미한다.
^[1-9][0-9]*$ 는 자연수를 표시할수 있다.
^(0|[1-9][0-9]*)$ 는 0을 포함하는 자연수
^(0|-?[1-9][0-9]*)$ 정수표시
^[0-9]+(.[0-9]+)?$ 소숫점 표시
^[0-9]+(.[0-9])?$ 소수점 둘째자리 까지
^[0-9]+(.[0-9]{1,2})?$ 소수점 둘째자리나 첫째자리
^[0-9]{1,3}(,[0-9])*(.[0-9]{1,2})?$ 돈의 표시...
(센트까지 표시가능 예 2,200.20 : 이천이백이십센트 또는 이천이백이십전 맞나?)

5. 복합활용
5-1 메일 주소 체킹..
5-1-1 : 유저명@도메인명
유저명 : 대문자, 소문자, 숫자 그리고 '.' '-' '_' 을 가질 수있지만 . 로 시작해서는 안된다.
[_0-9a-zA-Z-]+(.[_0-9a-zA-Z]+)*
이때에는 eregi 를 사용할때까 아닌 ereg 를 사용할때이다. eregi 함수는 대소문자구분이 없다.
^[_a-z0-9-]+(.[_a-z0-9-]+)*$ eregi 함수를 사용할때...

5-1-2 : 도메인 : 유저명과 기본적으로는 같지만 _ 가 없다.
^[a-z0-9-]+(.[a-z0-9-]+)*$

5-1-3 : 메일 주소 체킹
위의 것의 조합이다.
^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$

5-2 URL 에 http:// 붙여주기
URL 은 대문자, 소문자, 숫자 ,'.','_','=','&','?','~','@','/','+' 를 사용 할수 있다
http://([0-9a-zA-Z./@~?&=_]+) 가 된다.

$add="www.yesyo.com";
$pattern ="([0-9a-zA-Z./@~?&=_]+)";
$link =ereg_replace($pattern, "http://1" $add);
echo ("$link");


의 결과 $link 는 다음처럼 변경 된다.
http://www.yesyo.com
와 같이 된다. 참고로 1 은 첫번째 괄호안의 값을 말한다. 2는 2번째..
몇가지 복잡한 정규표현식을 풀다보면 이해하는데 도움이 될것이다 '
추천추천 : 372 추천 목록
번호 제목
3,033
 PHP 정규식 정리
3,032
 PHP 정규식을 활용한 태그 및 특정 문자열 제거 및 추출 방법
3,031
 php 크롤링 또는 파싱 함수, 정규식 모음
3,030
 제이쿼리 기본 명령어
3,029
 웹페이지 가로 모드세로 모드 인식하기
3,028
 모바일 웹 화면 강제 회전(가로모드 고정)
3,027
 [HTML5]에서 frameset 대체 방법과 iframe 속성
3,026
 HTML <Audio> 사용법
3,025
 윈도우10 시스템파일 손상 (초간단 오류 복구방법!!)
3,024
 PHP 파일 존재 여부 파악하기(로컬 파일 존재 및 원격지 파일 존재)
3,023
 [CSS] 박스 세로 가운데 중앙 정렬 6가지
3,022
 CSS Layout 수평 & 수직 정렬
3,021
 여러 도메인들 간 쿠키 공유하기
3,020
 태그 사이에 있는 텍스트를 추출
3,019
 [JQuery] textbox focus on off일때 숫자 콤마 보여주기
3,018
 쿠키 생성,가져오기,삭제
3,017
 사용자 함수 모음
3,016
 마우스,키보드 제한 ( 오른쪽클릭,드래그,영역선택등..)
3,015
 [HTML5] <video> - DOM으로 제어하기
3,014
 HTML5 video 태그에서 영상 좌우반전
3,013
 PHP - 특정 태그 및 문자열 추출, 제거
3,012
 [PHP] define과 defined의 차이
3,011
 우클릭 완벽차단 스크립트
3,010
 iframe 높이 100% 맞추기
3,009
 curl 함수를 이용한 HTTP REFERER 변경
목록
뮤직트로트 부산광역시 부산진구 가야동 ㅣ 개인정보취급방침
Copyright (C) musictrot All rights reserved.