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
'정규표현식' 카테고리의 다른 글
Python 정규표현식 문자열 추출 (0) | 2022.03.07 |
---|---|
Python 정규표현식 예제 (0) | 2022.02.06 |
JQuery 정규표현식을 활용한 페이징 처리(전방탐색, 후방탐색X) (0) | 2021.08.08 |
parse MAC Address using Java Regular Expression (0) | 2021.08.07 |
PHP 정규표현식 후방탐색, 전방탐색 (0) | 2021.07.28 |