티스토리 뷰

제가 PHP-SCHOOL 에서 정규식에 대해 답변했던 것들을 모아봤습니다.

이메일 유효성 검사

이메일, URL 유효성 검사 정규식은 많이 알려져 있고, 정규표현식을 공부할때 예제로 많이 사용하는 것이긴 합니다. 혹시 필요하신분이 있으실까 하여 적어봅니다.

$string = 'test@test.com';
preg_match(
    '!^[\w\d\_\.\-]+\@((?:[\w\d\_\-]+\.)+(?:[\w]+))$!i',
    trim($string),
    $match
);

print_r($match);


아이피의 각 자리수를 3자리에 맞춰 0을 채워넣기

여기서 주의해야할 건 치환해야할 문자열에 따옴표의 사용입니다. PHP에서는 " " (쌍따옴표) 안에 있는 변수는 해석하기 때문에 $1의 경우 오류가 날수 있습니다. 그래서 ' ' (홀따옴표)를 사용한 것입니다.
쌍따옴표를 사용할 시에는 \\1 와 같이 역슬래쉬를 두개 써서 표현하면 됩니다.
$1은 정규표현식에서 ( ) 로 캡쳐된 문자열을 나타냅니다.

$string = "192.168.0.12";
echo preg_replace(
    '!([\w]{1,3})!e',
    'sprintf("%03d",$1)',
    $string
);

특정 테그를 기준으로 분리할때, 분리에 사용한 테그도 캡쳐하기

아래 예는 preg_split() 함수를 이용해서 <td> 테그를 기준으로 문자열을 분리하는 예입니다.
그런데 일반적으로 분리를 하게 되면 분리에 사용한 문자열(<td>)는 결과에서 제외됩니다. 여기에서 preg_split() 의 옵션인 PREG_SPLIT_DELIM_CAPTURE 를 적어주면 분리문자까지 같이 리턴해 줍니다.

$string = <<<___HTML___
<table> 
    <tr>         <td>내용1</td>     </tr> </table> ___HTML___; $string = preg_split( '!(<td>)!i', $string, -1, PREG_SPLIT_DELIM_CAPTURE ); print_r($string);

<br> 테그 가 연속으로 여러번 있을 경우 1개로 줄이기

<br> 테그 앞뒤로 공백 및 탭문자가 있는지 확인을하고, <br> 테그가 연속으로 2번 이상 반복되면 1개로 줄여주는 정규식 입니다.

$string = <<<___HTML___
test content 0<br>
<br>
test content 1<br><br>
<p><br>test content 2<br>
test content 3</p>
___HTML___;

$string = preg_replace(
    '!([\s\t]*<(?:br|[/]?p)[\s/]*>[\s\t]*){2,}!mi',
    '<br />',
    $string
);

print_r($string);

<BR>, <P> 테그와 개행문자(\r\n, \n, \r)로 문자열 나누기

이 정규식은 문자열 끝에 <br>,<p> 테그나 개행문자가 함께있을 경우 각각 따로 적용되는게 아니라 둘을 한줄로 인식하여 분리해 줍니다.
개행문자로 나뉘지 않은 문자열 중간에 <br>,<p> 테그가 있을경우 <br>,<p> 테그를 기준으로 나눠줍니다.
<br> <br />  <p> </p> 모두 인식합니다.

$string = <<<___HTML___
test content 0<br>test content 1<br>
<p>test content 2<br>
test content 3</p> ___HTML___; $string = preg_split( '!(\<(?:br|[/]?p)[\s/]*\>[\s\r\n]+(?:\<p.*?\>)?|<(?:br|[/]?p)[\s/]*\>)!mi', $string ); print_r($string);

테그 안에 잡다한 속성 삭제하기

<img 테그 내에 특정 속성만 유지하고 다른 속성을 제거해야할 때가 있습니다.
사용자가 입력한 테그일 경우 속성이나 스타일을 제거하고 이미지 경로만 추출할때 사용하면 됩니다. 다른 테그에도 테그명만 바꾸면 동일하게 사용할 수 있습니다.
onClick 이벤트 등을 사용할 경우 약간 복잡하긴 하지만 조금 수정만 하면 캡쳐 가능합니다. 실습으로 한번 만들어 보세요. :)

$string = <<<___HTML___
test content 0<br>
<img style="WIDTH: 720px; HEIGHT: 485px" onclick=imgOpen(this.src) alt="이미지를 클릭하시면 원본크기로 보실수 있습니다." hspace=0 src="http://kai.ibbun.net/not_image.jpg"><br/>
test content 1<br>
test content 2
<img src="http://image.test.com/test.jpg" style="WIDTH: 720px; HEIGHT: 485px" alt="이미지를 클릭하시면 원본크기로 보실수 있습니다." hspace=0 />
___HTML___;

$string = preg_replace(
    '!\<img.*?src=["\'](.*?)[\'"].*?[/]?\>!mi',
    '<img src="$1" width="120" height="90" />',
    $string
);

print_r($string);

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함