>백엔드 개발 >PHP 튜토리얼 >PHP 7.3으로 업그레이드한 후 내 PHP 정규식에서 'preg_match(): 컴파일 실패: 문자 클래스의 잘못된 범위'가 나타나는 이유는 무엇입니까?

PHP 7.3으로 업그레이드한 후 내 PHP 정규식에서 'preg_match(): 컴파일 실패: 문자 클래스의 잘못된 범위'가 나타나는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-06 01:37:13247검색

Why Does My PHP Regex Produce

문자 클래스의 잘못된 범위: PHP 업그레이드 후 문제 이해

"preg_match(): 컴파일 실패: 문자 클래스의 잘못된 범위" 오류 메시지는 문제를 나타냅니다. 제공된 코드에 사용된 정규식을 사용합니다. 이 문제는 PHP 업그레이드 후, 특히 PCRE2 라이브러리 변경으로 인해 이전 버전에서 PHP 7.3 이상으로 마이그레이션할 때 발생할 수 있습니다.

PHP 7.3에서 PCRE2로 전환

PHP 7.3 사용 , PHP PCRE 엔진이 PCRE2로 전환되어 이전 버전과 호환되지 않는 몇 가지 변경 사항이 발생했습니다.

  • "S" 수정자는 패턴이 자동으로 연구되므로 효과가 없습니다.
  • "X' 수정자는 PCRE2에서 기본값으로 작동하며 큰 영향은 없습니다.
  • 유니코드 10은 PCRE2에서 구현되며 잠재적으로 유효하지 않은 패턴으로 동작 변경을 도입합니다.

문자 클래스의 하이픈: PHP 이전 및 이후 7.3

PHP 7.3 이전에는 하이픈을 이스케이프하거나 범위를 나타낼 수 없는 위치에 배치하면 문자 클래스 내에서 어떤 위치에서든 사용할 수 있었습니다. 그러나 PHP 7.3 이상에서는 PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL이 기본적으로 false로 설정되어 있습니다.

따라서 문자 클래스에 하이픈을 포함하려면:

  • 하이픈을 문자 클래스의 시작이나 끝 부분에 사용하세요. 그만큼 class.

예:

제공된 코드에서 문제가 있는 줄은 다음과 같습니다.

if(!preg_match("/^[a-z0-9]([0-9a-z_-\s])+$/i", $subuser)){

문제는 문자 내의 하이픈(-)에 있습니다. 클래스 [0-9a-z_-s]. 문제를 해결하려면 끝이나 시작 부분에 하이픈을 넣으세요.

if(!preg_match("/^[a-z0-9]([0-9a-z\_-\s0-9a-z\_-\s])+$/i", $subuser)){

추가 참조:

"PHP 7.3: PCRE2가 PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL을 제거했습니다"는 추가 정보를 제공합니다.

PCRE2는 패턴 검증에서 더 엄격하므로 업그레이드 후 일부 기존 패턴을 더 이상 컴파일할 수 없습니다.

따라서 PHP 7.3 이상 버전에서 PCRE2와의 호환성을 보장하려면 기존 패턴을 면밀히 조사하고 수정해야 할 수도 있습니다.

위 내용은 PHP 7.3으로 업그레이드한 후 내 PHP 정규식에서 'preg_match(): 컴파일 실패: 문자 클래스의 잘못된 범위'가 나타나는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.