채택완료

정규식 관련 질문드려요..

2014-05-06 (화) 11:44:50 4,466


<? 
$subject = "Go To page #9"; 
$pattern = "/([a-zA-Z]+ )+/"; 
echo preg_match($pattern, $subject, $matches);  
echo $matches[1]; 
?> 

에서 matches[1]은 page가 출력되는데 matcesh[1]은 ()안에 있는 패턴이니까 
[a-zA-Z]+ 
즉 이게 'Go'와 'To'는 포함되지 않고 'page'만 해당 된다는 뜻이죠? 
저 정규식을 해석해보면 영문 대소문자 모두와 +메타문자라는 소린데 그럼 
Go와 To도 포함되는거 아닌가요? 근데 page가 출력되는데.. 제가 뭘 잘못알고 있는건지.. 

|

답변 1개

채택된 답변
+20 포인트
영문 대소문자만 가지고 오겠다는 것이에요.

page만 보이는 것은 matches[1]을 했기 때문이에요

print_r(matches) 로 확인 해보세요.


즉,

1. [a-zA-Z]를 하면 대소문자로 시작하는 문자
2. + 했으니 대소문자 1개 이상
3. 공백이 하나 있으니

Go공백  To공백 page공백이 나오겠죠.

그런데
()+ 했으니 마지막에 있는 page에요.
()+에서 + 빼면 Go가 나오고요.

+는 직전값을 의미 하는 것이니깐요.
()는 그룹화 이고..

설명을 잘 못하겠는데요

하여튼
Go공백(1그룹)
To공백(2그룹)
page공백(3그룹)
이렇게라고 생각할 때
마지막에 있는 + 때문에 3그룹에 있는 것을 가르키게 되요.
그래서 page가 나오는 것이고요

답변을 작성하려면 로그인이 필요합니다.