728x90

PHP 로 정규표현식 문자열 추출하는 것을 다양한 예제를 통해서 알아본다.

잘못 파싱할 수 있는 오류를 방지하기 위해 아래 예제를 하나 하나 실행해 보시라.

아직 정규표현식을 완전히 마스터하지 못해서 처리하는 수준이 미약함.

 

문자열을 복사하여 https://regexr.com/ 에 붙여넣고 정규표현식을 육안으로 확인해보면 도움이 많이 된다.

 

읍면동 앞까지의 주소 추출하는 정규표현식

<?php
 
$str = "서울시 강동구 명일동 123번지 101동 702호";
if(strpos($str'동'!== false ){
    // (abc) : capture group
    // (?:abc) : non-capturing group (그룹으로 결과를 반환하지 말라)
    preg_match('/(.+?)[읍면동]\s/'$str,$out);
    echo trim($out[0]).'<br />';
}
 
?>

.+  와  .+? 의 차이점을 이해하면 원하는 걸 얻을 수 있다.

 

<?php
ini_set("display_startup_errors"1);
ini_set("display_errors"1);
error_reporting(E_ALL);
 
 
$str = "서울시 강동구 명일동 123번지 101동 702호";
if(strpos($str'동'!== false ){
    $stArr = explode(" "$str);
    foreach($stArr as $item){
        if(strpos($item'동'!== false ){
            echo $item.'<br />';
            // 원하는 결과를 반환하고 있는가?
        }
    }
echo '-----------------------------------------------<br/>';
 
// \b(word boundary) 는 영문자와 숫자는 포함되지만 한글은 포함되지 않는다.
// word는 한글과 같은 2바이트 문자를 포함하지 않기 때문에, 한글의 경계는 \b로 처리할 수 없다.
$str = "Hello, Java!";
preg_match('/\bJava\b/'$str,$out);
if(count($out)>0){
    // 그룹으로 묶지 않아서 일치하면 1개만 반환
    echo $out[0].'<br/>';
}
 
$str = "Hello, Java!";
preg_match('/\b(Java)\b/'$str,$out);
if(count($out)>0){
    // 그룹()으로 묶어서 일치하면 2개 반환
    echo '<pre>';print_r($out);echo '</pre>';
}
 
$str = "서울시 강남구 대치동 123번지";
if(strpos($str'동'!== false ){
    preg_match('/\b대치동\b/'$str,$out);
    if(count($out)>0){
        echo $out[0].'<br/>';
    } else {
        echo '추출 못함<br/>';
    }
}
 
 
$str = "서울시 강남구 대치동 123번지"
$str = "서울시 강동구 명일동 123번지 101동 702호"// 101동을 반환
if(strpos($str'동'!== false ){
    // (abc) : capture group
    // (?:abc) : non-capturing group (그룹으로 결과를 반환하지 말라)
    preg_match('/(?:.+)\s(.+)동/'$str,$out);
    echo '<pre>';print_r($out);echo '</pre>';
}
 
$str = "서울시 강동구 상일동 123번지 201동 501호"
if(strpos($str'동'!== false ){
    // (abc) : capture group
    // (?:abc) : non-capturing group (그룹으로 결과를 반환하지 말라)
    // 숫자로 시작하는 동은 대상에서 제외.
    preg_match('/(?:.+)\s([^0-9]+)동/'$str,$out);
    echo '<pre>';print_r($out);echo '</pre>';
}
 
// 공백으로 문자열을 분리하여 동이 들어간 문자열 반환
$str = "서울시 강동구 천호동 123번지 103동 208호";
if(strpos($str'동'!== false ){
    $stArr = explode(" "$str);
    foreach($stArr as $item){
        if(preg_match('/(.*)동$/'$item)){
            // 문자열의 끝($)이 동으로 끝나는 것만 반환하라.
            preg_match('/(.*)동$/'$item$out);
            echo '<pre>';print_r($out);echo '</pre>';
        }
    }
}
 
$str = "서울시 강동구 천호4동 123번지 103동 208호";
if(strpos($str'동'!== false ){
    $stArr = explode(" "$str);
    foreach($stArr as $item){
        if(preg_match('/(^[^0-9]{1,1}.+)동$/'$item)){
            preg_match('/(.*)동$/'$item$out);
            echo '<pre>';print_r($out);echo '</pre>';
        }
    }
}
 
?>
 

 

 

<?php
/*  정규표현식 문자 추출 예제 */
$str = "서울시 강동구 상일2동 123번지 201동 501호"
//$str = "서울시 강남구 대치2동 123번지"; 
echo getDongName($str);
echo '<br />';
 
function getDongName($str){
    if(strpos($str'동'!== false ){
        // (abc) : capture group
        // (?:abc) : non-capturing group (그룹으로 결과를 반환하지 말라)
        // 숫자로 시작하는 동은 대상에서 제외.
        preg_match('/(?:.+)\s([^0-9]{1,1}.+)동/'$str,$out);
        if(preg_match('/[^0-9]{1,1}.+동/'$out[1])){
            preg_match('/([^0-9]{1,1}.+)동/'$out[1],$rs);
            return $rs[1];
        } else {
            return $out[1];
        }
    }
}
?>

 

<?php
// .*? : lazy quantifier
$str = "서울시 강동구 길2동 123번지 103동 208호";
if(strpos($str'동'!== false ){
    preg_match('/(?:.+[도시]\s)(?:.+[시구]\s)(.+?)동/'$str$out);
    echo '<pre>';print_r($out);echo '</pre>';
}
 
$str = "서울시 강동구 천호3동 654번지 303동 502호";
if(strpos($str'동'!== false ){
    $out = preg_replace('/(?:.+[도시]\s)(?:.+[시구]\s)([^0-9]{1}.*?)동(?:\s.+)/',"\\1" ,$str);
    echo '<pre>';print_r($out);echo '</pre>';
}
 
$str = "서울시 강동구 천호2동 888번지 803동 502호";
if(strpos($str'동'!== false ){
    $out = preg_replace('/(?:.+[도시]\s)(?:.+[시구]\s)([^0-9]{1}.*?)동(?:\s.+)/',"$1" ,$str);
    echo '<pre>';print_r($out);echo '</pre>';
}
?>
 

 

728x90
블로그 이미지

Link2Me

,