PHP에서 문자열에 섞여 있는 특수 문자나 기호 등 영숫자(alphanumeric)가 아닌 문자를 제거하는 가장 일반적인 방법은 preg_replace 함수와 정규표현식을 조합하는 것입니다. 아래에서 두 가지 대표적인 방식을 예제와 함께 살펴보겠습니다.
예제 1: 문자 클래스 [^a-z0-9] 사용하기
<?php
$my_str = "Thisis!@sample*on&ly)#$";
$my_str = preg_replace('/[^a-z0-9]/i', '', $my_str);
echo "영숫자가 아닌 문자를 제거한 결과 문자열: ";
echo($my_str);
?>
출력 결과
영숫자가 아닌 문자를 제거한 결과 문자열: Thisissampleonly
코드 설명
preg_replace 함수는 정규표현식에 일치하는 부분을 지정한 값으로 치환하는 역할을 합니다. 위 예제에서 사용된 패턴 /[^a-z0-9]/i를 자세히 보면 다음과 같습니다.
- [^a-z0-9]: 대괄호 안의
^는 부정(not)을 의미합니다. 즉, 소문자 a~z와 숫자 0~9를 제외한 모든 문자와 일치합니다. - i 플래그: 패턴 끝에 붙는
i는 대소문자를 구분하지 않겠다는 옵션으로, 덕분에 대문자 A~Z도 제거 대상에서 제외됩니다.
먼저 문자열을 변수에 정의한 뒤 해당 변수에 preg_replace 함수를 호출하고, 일치하는 문자를 빈 문자열('')로 치환하여 제거합니다. 최종적으로 변환된 문자열이 화면에 출력됩니다.
예제 2: 메타 문자 \W 사용하기
<?php
$my_str = "This!#is^&*a)(sample*+_only";
$my_str = preg_replace('/[\W]/', '', $my_str);
echo "영숫자가 아닌 문자를 제거한 결과 문자열: ";
echo($my_str);
?>
출력 결과
영숫자가 아닌 문자를 제거한 결과 문자열: Thisisasample_only
코드 설명
두 번째 예제는 동일한 작업을 더 간결한 정규표현식으로 처리한 것입니다. \W는 단어 문자(word character)가 아닌 모든 문자와 일치하는 메타 문자로, [^a-zA-Z0-9]와 사실상 같은 의미입니다.
두 방식의 차이점
두 패턴은 비슷해 보이지만 한 가지 중요한 차이가 있습니다. \W는 언더스코어(_)를 단어 문자로 간주하기 때문에 결과에 그대로 남습니다. 반면 첫 번째 예제의 [^a-z0-9] 패턴은 언더스코어도 제거 대상에 포함됩니다. 따라서 언더스코어를 보존해야 한다면 \W를, 완전히 제거해야 한다면 [^a-z0-9] 패턴을 사용하는 것이 좋습니다. 상황에 맞는 패턴을 선택하면 데이터 정제, 입력값 검증, 슬러그(slug) 생성 등 다양한 작업에서 유용하게 활용할 수 있습니다.