YesYo.com MintState Forums
뒤로    YesYo.com MintState BBS > Tech > PHP
검색
멤버이름    오토
비밀번호 
 

알아두면 편한 정규표현식

페이지 정보

작성자 MintState 댓글 0건 조회 14,675회 작성일 08-11-03 11:24

본문

알아두면 편한 정규표현식

태터플러그인중의 하나인데 먼지는 모르겠습니다. ㅡㅡㅋ
// 글의 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('/&nbsp;?|\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(''','&apos;','&quot;'),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\_\-\./~@?=&amp;-\#{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번째..
몇가지 복잡한 정규표현식을 풀다보면 이해하는데 도움이 될것이다 '

댓글목록

등록된 댓글이 없습니다.

Total 165건 4 페이지
PHP 목록
번호 제목 글쓴이 조회 날짜
열람중 MintState 14676 11-03
89 MintState 14471 11-03
88 MintState 14719 11-03
87 MintState 13661 11-03
86 MintState 24488 11-03
85 MintState 19537 11-03
84 MintState 23333 11-03
83 MintState 15664 11-03
82 MintState 18178 11-03
81 MintState 19851 11-03
80 MintState 12478 11-03
79 MintState 13509 11-03
78 MintState 14505 11-03
77 MintState 14297 11-03
76 MintState 10361 11-03
75 MintState 15093 11-03
74 MintState 13307 11-03
73 MintState 12833 11-03
72 MintState 14310 11-03
71 MintState 10248 11-03
70 MintState 11157 11-03
69 MintState 14312 11-03
68 MintState 14250 11-03
67 MintState 12568 11-03
66 MintState 12186 11-03
게시물 검색
모바일 버전으로 보기
CopyRight ©2004 - 2024, YesYo.com MintState. ™