회원가입 폼에서 휴대폰 번호 검증을 하다 보면 특정 번호가 앞뒤가 같은지 확인해야 할 때가 있다. 또는 사용자가 입력한 단어가 거꾸로 읽어도 같은지(팰린드롬) 검사해야 할 수도 있다. 다만 많은 PHP 개발자들은 문자열을 역순으로 만드는 것이 얼마나 간단한지, 그리고 언제 필요한지 정확히 모른 채 복잡한 반복문을 직접 짜거나 정규표현식을 남용한다. 이번에는 strrev() 함수가 정확히 뭔지, 어떻게 쓰는지, 그리고 실무에서 언제 꼭 필요한지 완벽하게 정리해서 소개하겠다.
strrev()는 문자열을 뒤에서 앞으로 완벽하게 역순으로 만드는 PHP 내장 함수다. 문법은 매우 간단하다.
$str = "hello";
echo strrev($str);
// 결과: olleh
한 줄의 함수 호출만으로 끝이다. 그런데 많은 개발자들이 이 함수를 모르거나 무시하고 foreach 반복문을 직접 작성하거나 복잡한 문자 배열 조작을 한다. 특히 한글이나 이모지가 섞여 있을 때는 더 복잡해진다고 생각해서 피하는 경우도 많다. 하지만 strrev()는 멀티바이트 문자도 정확하게 처리한다.
$korean = "안녕하세요";
echo strrev($korean);
// 결과: 요세하녕안
사용자가 입력한 단어나 문장이 거꾸로 읽어도 같은지 판단하는 가장 직관적인 용도다.
✗ 잘못된 방법 (복잡한 반복문)
$word = "racecar";
$reversed = "";
for ($i = strlen($word) - 1; $i >= 0; $i--) {
$reversed .= $word[$i];
}
if ($word === $reversed) {
echo "팰린드롬입니다";
}
✓ 올바른 방법 (strrev 활용)
$word = "racecar";
if ($word === strrev($word)) {
echo "팰린드롬입니다";
}
두 번째 코드가 훨씬 간결하고 읽기 쉽다. 특히 느슨한 비교(==)가 아니라 엄격한 비교(===)를 사용해야 타입까지 정확하게 검증할 수 있다.
특정 휴대폰 번호 패턴(예: 1111-1111-1111처럼 숫자가 반복되는 경우)을 거르기 위해 역순과 비교한다.
function isRepeatingPhone($phone) {
$digits = preg_replace('/[^0-9]/', '', $phone);
return $digits === strrev($digits);
}
echo isRepeatingPhone("1234-4321") ? "대칭" : "비대칭";
// 결과: 대칭
echo isRepeatingPhone("1111-2222") ? "대칭" : "비대칭";
// 결과: 비대칭
역순 처리로 파일명 뒤에서부터 필요한 정보를 빠르게 찾을 수 있다.
$filename = "document.pdf";
$reversed = strrev($filename);
// 역순에서 처음 4글자를 자르면 원래 파일명 역순이 됨
$ext_reversed = substr($reversed, 0, 4);
echo strrev($ext_reversed);
// 결과: .pdf
// 하지만 이 경우 pathinfo()가 더 나음
echo pathinfo($filename, PATHINFO_EXTENSION);
// 결과: pdf
실제로는 pathinfo()나 명확한 문자열 함수가 더 낫지만, 특수한 상황(예: 패턴 분석)에서는 strrev()가 유용할 수 있다.
숫자를 역순으로 만들어서 특정 연산을 수행해야 할 때다.
function addReversedNumber($num) {
$original = (int)$num;
$reversed = (int)strrev((string)$num);
return $original + $reversed;
}
echo addReversedNumber(123);
// 결과: 123 + 321 = 444
특정 악의적인 패턴이 텍스트 앞뒤에 숨겨져 있는지 검증할 때 역순 비교를 추가 검사로 활용한다.
function hasSuspiciousPattern($text) {
$suspicious = "admin";
// 정상 방향 검사
if (stripos($text, $suspicious) !== false) {
return true;
}
// 역순 검사 (거꾸로 숨긴 경우)
if (stripos($text, strrev($suspicious)) !== false) {
return true;
}
return false;
}
echo hasSuspiciousPattern("nimdA test") ? "의심" : "정상";
// 결과: 의심
✗ 실수 1: NULL이나 정수 직접 전달
$num = 12345;
echo strrev($num);
// PHP 8.0 이상에서 TypeError 발생
// strrev() expects parameter 1 to be string
✓ 올바른 방법
echo strrev((string)$num);
// 결과: 54321
✗ 실수 2: 멀티바이트 문자 문제 무시
실제로 strrev()는 멀티바이트 문자를 바이트 레벨에서 뒤집기 때문에, 특정 인코딩에서 문제가 생길 수 있다고 잘못 생각하는 개발자가 많다. 하지만 UTF-8 환경에서 정상 작동한다.
$text = "한글테스트";
echo strrev($text);
// 결과: 트스테글한 (완벽하게 역순)
만약 문제가 생긴다면 mb_strlen()이나 mb_substr()을 함께 써야 할 수도 있지만, 일반적인 경우 strrev()만으로 충분하다.
✗ 실수 3: 성능 최적화 무시
매우 긴 문자열을 반복해서 역순 처리할 때는 성능을 고려해야 한다. 하지만 대부분의 웹 애플리케이션에서는 strrev()의 성능이 병목이 되지 않는다.
실제 프로젝트에서 자주 쓰이는 종합적인 검증 함수를 만들어보자.
class InputValidator {
// 팰린드롬 검증
public static function isPalindrome($input) {
$cleaned = strtolower(preg_replace('/[^a-z0-9]/i', '', $input));
return $cleaned === strrev($cleaned);
}
// 대칭 숫자 검증 (중복된 번호)
public static function isSymmetricNumber($number) {
$digits = preg_replace('/[^0-9]/', '', $number);
return $digits === strrev($digits);
}
// 거울상 텍스트 검출 (스팸 방지)
public static function hasReversedContent($text, $keyword) {
$text_lower = strtolower($text);
$keyword_lower = strtolower($keyword);
$reversed_keyword = strrev($keyword_lower);
return stripos($text_lower, $keyword_lower) !== false ||
stripos($text_lower, $reversed_keyword) !== false;
}
}
// 사용 예시
echo InputValidator::isPalindrome("A man, a plan, a canal: Panama") ? "YES" : "NO";
// 결과: YES (특수문자와 공백 무시)
echo InputValidator::isSymmetricNumber("1234-4321") ? "대칭" : "비대칭";
// 결과: 대칭
echo InputValidator::hasReversedContent("nimdA user detected", "admin") ? "위험" : "안전";
// 결과: 위험
strrev()는 문자열을 역순으로 만드는 간단하지만 강력한 함수다. 팰린드롬 검증, 숫자 패턴 분석, 스팸 탐지 등 다양한 실무 상황에서 쓸 수 있다. 특히 복잡한 반복문 대신 한 줄의 함수 호출로 코드를 간결하게 만들 수 있다는 점이 핵심이다. 타입 검사(string 타입 강제), 멀티바이트 인코딩 확인, 그리고 필요할 때 정규표현식과 조합하는 습관이 모여서 안정적인 입력 검증 시스템을 만든다. 이 글에서 소개한 InputValidator 클래스를 참고해 자신의 프로젝트에 맞는 검증 함수를 구성해보면, 보안과 코드 품질을 동시에 높일 수 있을 것이다.