【PHP】preg_match() 함수를 이용한 정규 표현의 매칭의 거동이 7.2계에서 7.3계로 바뀌고 있다(PCRE의 버전 변경)
preg_match() 함수에서 오류가 발생했습니다.
아무렇지도 않게 로컬 개발 환경에서 Laravel용 Homestead의 버전을 올려, 과거의 프로젝트의 테스트(PHPUnit)를 달려 보았을 때,
지금까지 나오지 않았던 에러가 발생.
preg_match(): Compilation failed: invalid range in character class at offset **
발생 개소적으로 밸리데이션의 테스트를 쓰고 있는 곳에서, 정규 표현의 룰로 에러가 나와 있는 것 같다.
왜 갑자기? ? 그래서 조사 시작
PHP7.2계(7.1계)와 PHP7.3계의 거동
간단한 반각 영숫자와 하이픈을 통한 정규 표현의 처리를 써 보았습니다.
<?php
$str = 'RANDOMWORD-123';
var_dump(preg_match('/^[a-zA-Z0-9\s--]+$/', $str));
이하가 PHP7.1계~PHP7.3계의 결과
htps // 3v4l. rg/42BcG
음 - 왜? ? 버전 올렸기 때문에 그렇게 크리티컬한 에러가 나오게 되는 것인데・・・?
라고 생각하면서 구그 하면 Stack Overflow에서 코타에와 같은 발견
개 php - preg_match(): Compilation failed: invalid range in character class at offset 20 - Stack Overflow
A character class range is defined by using - between two values in a character class ( []
in regex). , [0-9]
, a-z
. There is also one class that you probably didn't mean to put there, namely 0-9
.
"/^[a-z0-9]([0-9a-z_-\s])+$/i"
^^^^
This is apprently not considered an invalid character range in some (most?) versions of PCRE (the regular expression library PHP uses), but it might have changed recently, and if the PCRE library was upgraded on the server, that might be .
아래 부분 Google 번역
PCRE(PHP에서 사용하는 정규식 라이브러리) 버전이지만 최근 변경되었을 수 있습니다. PCRE 라이브러리가 서버에서 업그레이드된 경우에는 이유일 수 있습니다.
같다.
아무래도 PHP7.3계로부터이므로
PCRE:
Implemented htps : // 우우키. php. 네 t / rfc / pc 2-mi g 라치온 .
Upgrade PCRE2 to 10.32.
Fixed bug #75355 (preg_quote() does not quote # control character).
Fixed bug #76512 (\w no longer includes unicode characters).
Fixed bug #76514 (Regression in preg_match makes it fail with PREG_JIT_STACKLIMIT_ERROR).
Fixed bug #76909 (preg_match difference between 7.3 and < 7.3).
이 근처의 수정·갱신 대응이 들어갔기 때문에 무엇입니까···?
오류가 발생하지 않도록 정규식을 작성하는 방법 수정
어쨌든 Stack Overflow에서 지적된 것처럼 하이픈( _-\s
)이 원인인 것 같기 때문에 위치를 바꾸어 보겠습니다.
<?php
$str = 'RANDOMWORD-123';
var_dump(preg_match('/^[a-zA-Z0-9\s--]+$/', $str)); // ハイフン(-)の位置を変えた
이하 PHP7.1(7.1.25)~PHP7.3(7.2.17)에서의 실행 결과
htps // 3v4l. rg/hCfWq
오류가 사라졌습니다.
끝
preg_match(): Compilation failed: invalid range in character class at offset **
간단한 반각 영숫자와 하이픈을 통한 정규 표현의 처리를 써 보았습니다.
<?php
$str = 'RANDOMWORD-123';
var_dump(preg_match('/^[a-zA-Z0-9\s--]+$/', $str));
이하가 PHP7.1계~PHP7.3계의 결과
htps // 3v4l. rg/42BcG
음 - 왜? ? 버전 올렸기 때문에 그렇게 크리티컬한 에러가 나오게 되는 것인데・・・?
라고 생각하면서 구그 하면 Stack Overflow에서 코타에와 같은 발견
개 php - preg_match(): Compilation failed: invalid range in character class at offset 20 - Stack Overflow
A character class range is defined by using - between two values in a character class (
[]
in regex). , [0-9]
, a-z
. There is also one class that you probably didn't mean to put there, namely 0-9
."/^[a-z0-9]([0-9a-z_-\s])+$/i"
^^^^
This is apprently not considered an invalid character range in some (most?) versions of PCRE (the regular expression library PHP uses), but it might have changed recently, and if the PCRE library was upgraded on the server, that might be .
아래 부분 Google 번역
PCRE(PHP에서 사용하는 정규식 라이브러리) 버전이지만 최근 변경되었을 수 있습니다. PCRE 라이브러리가 서버에서 업그레이드된 경우에는 이유일 수 있습니다.
같다.
아무래도 PHP7.3계로부터이므로
PCRE:
Implemented htps : // 우우키. php. 네 t / rfc / pc 2-mi g 라치온 .
Upgrade PCRE2 to 10.32.
Fixed bug #75355 (preg_quote() does not quote # control character).
Fixed bug #76512 (\w no longer includes unicode characters).
Fixed bug #76514 (Regression in preg_match makes it fail with PREG_JIT_STACKLIMIT_ERROR).
Fixed bug #76909 (preg_match difference between 7.3 and < 7.3).
이 근처의 수정·갱신 대응이 들어갔기 때문에 무엇입니까···?
오류가 발생하지 않도록 정규식을 작성하는 방법 수정
어쨌든 Stack Overflow에서 지적된 것처럼 하이픈( _-\s
)이 원인인 것 같기 때문에 위치를 바꾸어 보겠습니다.
<?php
$str = 'RANDOMWORD-123';
var_dump(preg_match('/^[a-zA-Z0-9\s--]+$/', $str)); // ハイフン(-)の位置を変えた
이하 PHP7.1(7.1.25)~PHP7.3(7.2.17)에서의 실행 결과
htps // 3v4l. rg/hCfWq
오류가 사라졌습니다.
끝
<?php
$str = 'RANDOMWORD-123';
var_dump(preg_match('/^[a-zA-Z0-9\s--]+$/', $str)); // ハイフン(-)の位置を変えた
참고 URL
Reference
이 문제에 관하여(【PHP】preg_match() 함수를 이용한 정규 표현의 매칭의 거동이 7.2계에서 7.3계로 바뀌고 있다(PCRE의 버전 변경)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sola-msr/items/e1008983b924738f2688텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)