정의 및 사용 방법
- PHP 버전
- 4+
preg_quote() 함수는 주어진 문자열의 문자 중에서 정규 표현식에서 특별한 의미나 기능으로 해석되는 문자, 즉 '정규 표현식 특수문자' 앞에 백슬래시(\) 문자를 추가로 붙여 이스케이프해 줍니다.
- 정규 표현식 특수문자(special regular expression characters)
- 정규 표현식에서 특별한 의미나 기능으로 해석되는 문자를 '정규 표현식 특수문자'라고 합니다.
- 이스케이프(escape)
- 특정 문자나 기호가 원래 가지고 있던 특별한 의미나 기능에서 '벗어나(escape)', 문자 그대로 해석되도록 만드는 것을 말합니다.
이렇게 정규 표현식 특수문자 앞에 백슬래시(\) 문자를 추가하는 이유는, 해당 문자가 정규 표현식 구문으로 해석되지 않고 문자 그대로 처리되도록 '이스케이프'하기 위해 사용합니다.
구문
preg_quote(string $str, ?string $delimiter = null): string
매개변수
이 함수에서 기본적으로 이스케이프 처리하는 정규 표현식 특수문자들은 다음과 같습니다.
.,\,+,*,?,[,^,],$,(,),{,},=,!,<,>,|,:,-,#- 이 함수에서 기본적으로
/는 정규 표현식 특수문자로 해석되지 않습니다.
단, 두 번째 매개 변수인$delimiter로 지정하면/도 이스케이프 처리됩니다.
반환 값
대상 문자열($str) 내의 정규 표현식 특수문자(및 $delimiter로 지정한 구분자) 앞에 백슬래시(\) 문자를 추가로 붙여 이스케이프 처리된 문자열을 반환합니다.
변경 이력
| 버전 | 설명 |
|---|---|
| 7.3.0 | 이제는 # 문자도 기본적으로 이스케이프 처리합니다. |
| 7.2.0 | 두 번째 매개 변수인 $delimiter가 이제 nullable하게 변경되었습니다. 이것은 매개변수의 값으로 null을 지정할 수 있음을 의미합니다. |
기본 예제
/* preg_quote() 함수는
PHP 버전별 작성 구문에 차이가 있습니다! */
$str = '즐겁게 #PHP#를 배워요~'; // '#'은 정규 표현식 패턴의 시작과 끝을 나타내는 구분자(Delimiter)로 사용됨
// PHP 7.3.0부터는 '#'이 기본 이스케이프 대상에 포함됩니다.
$escaped_str = preg_quote($str);
// PHP 7.3.0 이전 버전은 구분자를 직접 지정해야 함: $escaped_str = preg_quote($str, '#');
echo $escaped_str; // '#' 문자 앞에 백슬래시(\)가 추가됩니다.
// 출력: 즐겁게 \#PHP\#를 배워요~
preg_quote() 함수로 이스케이프된 문자열 활용하기
preg_quote() 함수를 사용해 백슬래시(\) 문자가 추가된 문자열은 어디에 활용할까요?
예를 들면 다음과 같은 경우입니다.
검색에 활용
웹사이트 검색창 등에서 사용자가 입력한 검색어를 정규 표현식 패턴으로 사용할 때, 검색어에 포함된 특수문자가 정규식 문법으로 해석되어 에러가 발생하는 것을 막고 안전하게 검색을 수행하기 위해 이스케이프 처리를 진행하는 경우입니다.
/* 사용자가 입력한 검색어 (예를 들어 정규 표현식 특수문자 '+'가 포함될 수도 있다고 가정) */
$search = 'C++';
/* 검색 대상 텍스트 예 */
$text = '요즘은 C++ 언어도 많이 사용합니다.';
/* 입력값의 특수문자 앞에 백슬래시(\)를 붙여 안전하게 이스케이프 처리 */
$safe_search = preg_quote($search, '/'); // 'C\+\+'로 처리
/* preg_match()를 사용해 검색어가 존재하는지를 체크하기 위해 정규 표현식 패턴으로 만듦
* preg_match($pattern, $subject) 함수는
* 주어진 정규 표현식 패턴($pattern)을 사용하여 문자열($subject) 내에서 일치하면 true를 반환함
*/
$pattern = '/' . $safe_search . '/i'; // 양쪽 '/'는 정규식 시작/끝 구분자,
// 뒤의 'i'는 $safe_search를 대소문자로 구분하지 않는 옵션
/* 안전하게 정규 표현식 검색 수행 */
if (preg_match($pattern, $text)) {
echo '검색하신 단어가 본문에 존재합니다!';
}
// 출력: 검색하신 단어가 본문에 존재합니다!
코드 부연설명
preg_match() 함수에 대한 자세한 설명은 PHP preg_match() 함수 – 정규 표현식으로 문자열이 일치하는지 검사를 참조하세요.
문자열 교체에 활용
본문 내에서 특정 단어를 찾아 다른 문자열로 바꾸거나, 사용자가 검색한 단어를 강조(하이라이팅)할 때도 preg_replace() 함수와 함께 이스케이프 처리를 활용합니다. 특히 검색어에 $ 같은 정규 표현식 특수문자가 포함된 경우, 그대로 정규 표현식 패턴에 사용하면 특수문자로 해석될 수 있으므로 preg_quote() 함수로 미리 안전하게 변환해야 합니다.
/* 사용자가 입력한 검색어 (정규 표현식에서 끝 지점을 의미하는 특수문자 '$'가 포함됨) */
$search = '$100';
/* 검색 대상 본문 텍스트 예 */
$text = '이번 주 특별 할인 품목은 $100 상품입니다.';
/* 입력값의 특수문자 앞에 백슬래시(\)를 붙여 안전하게 이스케이프 처리 */
$safe_search = preg_quote($search, '/'); // '\$100'으로 처리
/* preg_replace()를 사용해 검색어를 <mark> 태그로 교체하기 위한 정규 표현식 패턴 생성 */
$pattern = '/' . $safe_search . '/i'; // '/\$100/i' 형태로 패턴이 완성됨
/* 본문 내에서 일치하는 단어를 <mark> 태그로 교체 */
$highlighted = preg_replace($pattern, '<mark>$0</mark>', $text);
echo $highlighted;
// 출력: 이번 주 특별 할인 품목은 <mark>$100</mark> 상품입니다.
코드 부연설명
preg_replace() 함수는 문자열 내에서 정규 표현식을 사용하여 특정 패턴을 찾아 다른 문자열로 바꾸는(교체하는) 함수입니다.