PHP 5.3 이상에서 ereg 계열 함수를 preg 계열 함수로 마이그레이션하기
페이지 정보

본문
PHP 버전 업그레이드 후 발생하는 ereg 관련 함수 오류를 해결하고 그누보드 환경에 맞게 코드를 수정하는 방법을 알아봅니다.
PHP 5.3 업그레이드 후 ereg 관련 함수 오류 원인
PHP 5.3.0 이상 버전부터는 기존에 문자열 검색 및 치환에 사용되던 ereg(), eregi(), ereg_replace() 등의 ereg 계열 정규식 함수가 DEPRECATED(비권장) 처리되고 이후 버전에서 배제되었습니다.
이로 인해 PHP 버전을 5.3 이상으로 업그레이드한 환경에서 해당 함수를 호출할 경우 E_DEPRECATED 오류 레벨에 따라 화면에 ereg() is deprecated 또는 Call to undefined function eregi()와 같은 오류 메시지가 발생하게 됩니다.
따라서 PHP 5.3 이상 환경에서는 지원이 중단된 ereg 계열 함수 대신 PCRE 기반의 preg_match() 및 preg_replace() 함수로 코드를 마이그레이션해야 합니다.
ereg() 및 eregi() 함수를 preg_match()로 교체할 때 정규식 패턴 수정 방법
PHP 5.3 이상 환경에서 지원이 중단된 ereg() 및 eregi() 함수를 preg_match() 함수로 교체할 때는 정규식 표현 방식에 차이가 있으므로 패턴 형식을 수정해야 합니다.
1. 정규식 패턴에 구분자(/) 추가
ereg() 함수에서 사용하던 정규식 패턴의 시작과 끝에 구분자(/)를 추가해야 합니다. 구분자를 추가하지 않으면 오류가 발생합니다.
- 변경 전 (
ereg):ereg('\.([^\.]*$)', $this->file_src_name, $extension) - 변경 후 (
preg_match):preg_match('/\.([^\.]*$)/', $this->file_src_name, $extension)
2. 대소문자 무시(i) 옵션 적용
ereg()는 대소문자를 구분하는 ereg()와 구분하지 않는 eregi() 함수로 나누어져 있었으나, preg_match()는 하나의 함수로 통합되어 처리됩니다. 대소문자를 구분하지 않고 비교하려면 패턴의 끝 구분자 뒤에 i 옵션을 추가합니다.
- 변경 전 (
eregi):eregi('\.([^\.]*$)', $this->file_src_name, $extension) - 변경 후 (
preg_match+i옵션):preg_match('/\.([^\.]*$)/i', $this->file_src_name, $extension)
eregreplace()와 eregireplace() 함수 마이그레이션 방법
PHP 5.3 이상 환경에서 지원이 중단된 문자열 치환 함수인 ereg_replace()와 eregi_replace()는 preg_replace() 함수로 교체해야 합니다.
대체 함수 및 인자 구조
두 함수의 인자 순서는 ($pattern, $replacement, $string)으로 서로 같습니다. 다만 정규식을 표현하는 방식에 차이가 있으므로 아래 규칙에 맞게 수정해야 합니다.
- ereg_replace():
preg_replace()로 변경하며, 정규식 패턴 앞뒤에 구분자(/)를 추가해야 합니다. - eregi_replace():
preg_replace()로 변경하되, 대소문자를 구분하지 않는 성질을 유지하기 위해 정규식 패턴 끝에i옵션을 추가해야 합니다.
코드 수정 예시
- 변경 전 (ereg_replace):
$this->file_dst_name_body = ereg_replace('[^A-Za-z0-9_]', '', $this->file_dst_name_body); - 변경 후 (preg_replace):
$this->file_dst_name_body = preg_replace('/[^A-Za-z0-9_]/', '', $this->file_dst_name_body); - 대소문자 무시 적용 시: 패턴 끝에
/i를 추가하여/^ABC/i형태로 사용합니다.
PHP 5.3 이후 split 함수 대체 방법
PHP 5.3 이후 버전에서 지원이 중단된 split() 함수는 문자열 분리 기능을 수행하는 explode() 함수로 대체할 수 있습니다. 또한 spliti() 함수의 경우 preg_split() 함수에 대소문자를 구분하지 않는 i 옵션을 사용하여 대체합니다.
PHP 5.3 이상에서 비권장 INI 설정 및 오류 해결 방법
PHP 5.3.0 이상으로 버전이 올라가면서 새로운 오류 레벨인 E_DEPRECATED와 E_USER_DEPRECATED가 추가되었습니다. 이로 인해 지원되지 않거나 폐기 예정인 함수뿐만 아니라, INI 지시자 중에서 유효로 설정하면 E_DEPRECATED 오류를 유발하는 설정들이 존재합니다.
비권장 INI 지시자 설정 제거
다음과 같은 INI 지시자 중 하나라도 유효로 설정되어 있으면 오류가 발생하므로 설정을 제거하거나 비활성화해야 합니다.
define_syslog_variablesregister_globalsregister_long_arrayssafe_modemagic_quotes_gpcmagic_quotes_runtimemagic_quotes_sybase
특히 magic_* 관련 설정이나 register_globals 같은 옵션은 오래된 홈페이지나 소스 코드에서 사용되던 비권장 설정이므로, PHP 설정 파일(php.ini)에서 해당 항목들을 확인하여 유효하지 않도록 정리해야 합니다.
PHP 5.3 이상 환경에서 ereg 계열 함수 마이그레이션 가이드
- 상황: PHP 5.3 이상으로 업그레이드된 서버에서 기존 소스코드 내
ereg(),eregi(),ereg_replace()함수 사용으로 인해E_DEPRECATED오류 또는 정의되지 않은 함수 오류가 발생하는 경우 - 선택 기준:
- 패턴 매칭:
ereg()를preg_match()로 변경하고 패턴 앞뒤에 구분자(/) 추가 - 대소문자 무시:
eregi()대신preg_match()패턴 끝에i옵션 추가 - 문자열 치환:
ereg_replace()및eregi_replace()를preg_replace()로 변경
- 패턴 매칭:
- 다음 행동: 소스코드 전체에서 대상 함수를 검색하여 위 기준에 따라 함수명과 정규식 패턴을 수정하고,
php.ini에서 비권장 INI 설정(magic_quotes등)이 활성화되어 있는지 확인 후 제거
실전 FAQ
Q. preg_match()로 변경할 때 정규식 패턴에 구분자(/)를 넣지 않으면 어떻게 되나요?
- 답변:
preg_match()함수는 PCRE 호환 정규 표현식을 사용하므로 패턴의 시작과 끝을 알리는 구분자(주로/)가 없으면No delimiter entered등과 같은 정규식 경고 또는 오류가 발생합니다. 반드시 패턴 양끝에 구분자를 추가해야 합니다.
Q. ereg_replace()를 preg_replace()로 바꿀 때 인자 순서도 바뀌나요?
- 답변:
ereg_replace($pattern, $replacement, $string)과preg_replace($pattern, $replacement, $subject)는 인자 순서가 동일합니다. 다만 정규식 패턴 문자열에 구분자를 추가하고 문법 차이를 반영해야 합니다.
Q. PHP 5.3 이상에서 E_DEPRECATED 오류가 계속 발생한다면?
- 답변: 함수 교체 외에도
magic_quotes_gpc나register_globals와 같은 비권장 INI 지시자가 설정되어 있는지 확인하십시오. 이 설정들이 유효하면E_DEPRECATED오류가 발생하므로php.ini에서 해당 항목을 비활성화해야 합니다.
함께 보면 좋은 글
- 그누보드 5.3 이상 자동등록방지 캡차 제거 및 특정 게시판 예외 처리 방법
- PHP 5.3 이상 환경에서 MSSQL 연동 드라이버 변경 및 설정 방법
- MD5에서 SHA256으로 비밀번호 암호화 마이그레이션 및 하위 호환성 처리 방법
참고자료
기타 참고자료
- offbyone.tistory.com — PHP 마이그레이션시 자주 나오는 DEPRECATED 함수 대체하기
- happyjung.com — PHP 5.3 부터 ereg() 함수가 죽었다, preg_match() 로 교체하라 > 기술자료 | 해피정닷컴
- m.blog.naver.com — php5.3이후 버전의 eregi,ereg() 오류에 대한 대체 함수 : 네이버 블로그
- 88240.tistory.com — shaking blog :: PHP eregreplace()와 pregmatch() 함수 설명
- wonpaper.tistory.com — PHP 정규표현식 예제 일괄 텍스트 변경하기, eregi 를 preg_match 로 변경 (PHP5 -> PHP7)
- 이전글그누보드 게시판 스킨 제작 시 파일 및 리소스 경로 설정 방법 26.10.09
- 다음글PHP에서 구글 맵 지오코딩 API를 이용한 주소 좌표 추출 가이드 26.10.08
댓글목록
등록된 댓글이 없습니다.