Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP 정규식에서 [\S\s]*의 의미와 올바른 사용법

PHP 정규식에서 [\S\s]*줄바꿈 문자를 포함한 모든 문자와 일치하는 패턴입니다. 일반적인 마침표(.)는 줄바꿈(\n)을 매칭하지 못하지만, [\S\s]는 문자 종류를 가리지 않고 일치시킬 수 있어 여러 줄로 된 텍스트를 다룰 때 자주 활용되는 관용구입니다.

[\S\s]*의 동작 원리

정규식에서 \s는 공백, 탭, 줄바꿈(\n) 등 모든 공백 문자를 의미하고, \S는 공백이 아닌 문자를 의미합니다. 이 둘을 대괄호 문자 클래스로 묶은 [\S\s]는 결국 '어떤 문자든 한 개'와 일치하며, 뒤에 붙은 *(0회 이상 반복) 덕분에 길이에 상관없이 임의의 전체 문자열을 매칭할 수 있습니다.

/s 플래그와의 관계

PHP(PCRE)에서는 패턴 구분자 뒤에 s 플래그(DOTALL)를 붙이면 마침표(.)도 줄바꿈을 포함한 모든 문자와 일치하도록 만들 수 있습니다. 즉, /.*/s[\S\s]*는 실질적으로 같은 결과를 내며, 플래그 수정이 어려운 상황에서 [\S\s]*가 좋은 대안이 됩니다.

예제 코드

print(preg_match('/^[\S\s]*$/s', "hello \n world"));

실행 결과

1

코드 해설

preg_match() 함수는 입력 문자열에서 정규식 패턴과 일치하는 부분을 찾으며, 매칭에 성공하면 1, 실패하면 0을 반환합니다. 위 예제의 패턴 ^[\S\s]*$는 문자열의 시작(^)부터 끝($)까지 줄바꿈을 포함한 모든 문자와 일치하므로 결과로 1이 출력됩니다.

반면 수량자 없이 ^[\S\s]$처럼 작성하면 딱 한 글자만 허용됩니다. 이 경우 "hello \n world"처럼 여러 글자가 있는 문자열은 앵커 조건을 만족하지 못해 0(매칭 실패)이 반환됩니다. 원문 예제에서 0이 나온 것도 바로 이 때문입니다.

정리하면, [\S\s]*는 줄바꿈 경계에 구애받지 않고 문서 전체를 한 번에 매칭하고 싶을 때 유용하게 쓰이는 정규식 패턴입니다.