profile

이 세상에 하나는 남기고 가자

세상에 필요한 소스코드 한줄 남기고 가자

PHP 정규식(PCRE)의 모든 것 - 유니코드 문자 속성(Unicode character properties)

유영재

Unicode character properties (유니코드 문자 속성)

PHP 5.1.0 이후부터 UTF-8 모드가 선택되면 일반 문자 유형과 일치하는 세 개의 추가 이스케이프 시퀀스를 사용할 수 있다.

문자 설명
\p{xx} xx 속성을 가지는 문자
\P{xx} xx 속성을 가지지 않는 문자
\X 확장 유니코드 시퀀스

위의 xx로 표시된 속성 이름은 유니코드 일반 범주 속성으로 제한된다. 각 문자에는 정확히 두 개의 문자로 된 약어가 지정된다.

Perl과의 호환성을 위해 여는 중괄호({)와 속성 이름 사이에 곡절 부호(^)를 포함하여 부정을 지정할 수 있다. 예를 들어 \p{^Ll}\P{Lu}와 같다(메뉴얼에는 \p{^Lu}라고 표기되어 있으나 오타다. 아래의 예시를 실행해보면 된다).

<?php
echo (preg_match('/\p{^Lu}/', 'ABC') ? 'true' : 'false') . "\n";
// false
echo (preg_match('/\p{^Ll}/', 'ABC') ? 'true' : 'false') . "\n";
// true

\p 또는 \P에 한 문자만 지정하면 해당 문자로 시작하는 모든 속성이 포함한다. 이 경우 부정이 없는 경우 이스케이프 시퀀스의 중괄호({)는 선택사항이다. 아래의 두 예제는 같다.

\p{L}
\pL

Supported property codes

Property Matches Notes
C 기타(Other)
Cc 제어(Control)
Cf 형식(Format)
Cn 미할당(Unassigned)
Co 사적 사용(Private use)
Cs 대리(Surrogate)
L 문자(Letter) 다음의 속성을 포함 : Ll, Lm, Lo, Lt, Lu
Ll 소문자(Lower case letter)
Lm 변경자(Modifier letter)
Lo 기타 문자(Other letter)
Lt 표제 문자(Title case letter)
Lu 대문자(Upper case letter)
M 마크(Mark)
Mc 자간 마크(Spacing mark)
Me 동봉 마크(Enclosing mark)
Mn 비자간 마크(Non-spacing mark)
N 숫자(Number)
Nd 10진수(Decimal number)
Nl 문자수(Letter number)
No 기타 수(Other number)
P 구두(Punctuation)
Pc 연결 구두(Connector punctuation)
Pd 대시 구두(Dash punctuation)
Pe 닫는 구두(Close punctuation)
Pf 종료 구두(Final punctuation)
Pi 초기 구두(Initial punctuation)
Po 기타 구두(Other punctuation)
Ps 열기 구두(Open punctuation)
S 심볼(Symbol)
Sc 통화 심볼(Currency symbol)
Sk 변경 심볼(Modifier symbol)
Sm 수학 심볼(Mathematical symbol)
So 기타 심볼(Other symbol)
Z 구분자(Separator)
Zl 줄 구분자(Line separator)
Zp 문단 구분자(Paragraph separator)
Zs 공백 구분자(Space separator)

PCRE에서는 "Greek" 또는 "InMusicalSymbols"와 같은 확장 속성을 지원하지 않는다.

대문자와 소문자를 구별하지 않는(caseless) 매칭을 지정해도 이러한 이스케이프 시퀀스에는 영향을 미치지 않는다. 예를 들어 \p{Lu}는 항상 대문자만 일치시킨다.

\X 이스케이프는 확장 유니코드 시퀀스를 형성하는 모든 유니코드 문자와 일치한다. \X(?>\PM\pM*)와 동일하다.

즉, "mark" 속성이 없는 문자에 일치하거나, "mark" 속성에 붙는 하나 이상의 문자에 일치하고, 시퀀스를 원자 집단으로 취급한다. "mark" 속성을 가지는 문자는 일반적으로 선행 문자에 영향을 주는 엑센트다.

PCRE가 15,000개가 넘는 문자가 들어있는 구조체를 검색해야 하기 때문에 유니코드 속성에 일치하는 문자가 빠르지 않다. 이것이 \d\w 같은 전통적인 이스케이프 시퀀스가 PCRE에서 유니코드 속성을 사용하지 않는 이유다.


comments powered by Disqus