이후 POSIX 정규 표현식 (EREG)는 PHP 5.3.0부터 사용되지 않습니다, 나는에 이전 식을 변환하는 쉬운 방법을 알고 싶습니다 PCRE (펄 호환 정규 표현식) (레그)를 .
예를 들어 다음과 같은 정규 표현식이 있습니다.
eregi('^hello world');
식을 preg_match
호환 가능한 식 으로 변환하려면 어떻게 해야합니까?
참고 : 이 게시물은 ereg에서 preg 로의 전환과 관련된 모든 게시물의 자리 표시 자 및 관련 질문에 대한 중복 옵션으로 사용됩니다. 이 질문을 닫지 마십시오.
관련 :
답변
구문의 가장 큰 변화는 구분 기호 추가입니다 .
ereg('^hello', $str);
preg_match('/^hello/', $str);
구분자는 영숫자, 백 슬래시 또는 공백 문자가 아닌 거의 모든 것이 될 수 있습니다. 대부분의 사용은 일반적으로 ~
, /
그리고 #
.
일치하는 대괄호를 사용할 수도 있습니다.
preg_match('[^hello]', $str);
preg_match('(^hello)', $str);
preg_match('{^hello}', $str);
// etc
구분 기호가 정규식에 있으면 이스케이프해야합니다.
ereg('^/hello', $str);
preg_match('/^\/hello/', $str);
preg_quote 를 사용하여 문자열에서 모든 분리 문자 및 예약 문자를 쉽게 이스케이프 할 수 있습니다 .
$expr = preg_quote('/hello', '/');
preg_match('/^'.$expr.'/', $str);
또한 PCRE는 다양한 것을위한 수정자를 지원합니다 . 사용되는 가장 중 하나는 대소 문자를 구별 수정이다 i
,로 대체 eregi :
eregi('^hello', 'HELLO');
preg_match('/^hello/i', 'HELLO');
당신의 전체 참조 찾을 수 있습니다 설명서의 PHP에서 PCRE 구문 뿐만 아니라 차이의 목록 발현을 변환 도움에 POSIX 정규식과 PCRE 사이를.
그러나 간단한 예에서는 정규식을 사용하지 않습니다.
stripos($str, 'hello world') === 0
답변
preg (PHP 5.3.0 현재) 로의 Ereg 대체가 우리에게 유리한 조치였습니다.
Perl 호환 정규 표현식 구문을 사용하는 preg_match는 종종 ereg의 빠른 대안입니다.
ereg 패턴을 preg로 포팅하기위한 4 가지 주요 사항을 알아야합니다.
-
구분 기호 추가 (/) :
'pattern' => '/pattern/'
-
패턴의 일부인 경우 분리 문자를 이스케이프
'patt/ern' => '/patt\/ern/'
하십시오. 프로그래밍 방식으로 다음과 같은 방법으로 달성하십시오.
$old_pattern = '<div>.+</div>';
$new_pattern = '/' . addcslashes($old_pattern, '/') . '/';
-
eregi (대 / 소문자 구분 안 함) : 대 / 소문자 구분없이
'pattern' => '/pattern/i'
eregi 기능을 사용하는 경우 새 패턴 끝에 ‘i’를 추가하면됩니다 ( ‘/ pattern /’). -
ASCII 값 : ereg에서 패턴에 숫자를 사용하면 문자의 ASCII를 참조한다고 가정합니다. 그러나 preg에서 숫자는 ASCII 값으로 취급되지 않습니다. 따라서 패턴에 ereg 표현식에 ASCII 값이 포함 된 경우 (예 : 줄 바꾸기, 탭 등) 16 진수로 변환하고 접두사 \ x를 붙입니다.
Example: 9(tab) becomes \x9 or alternatively use \t.
답변
PHP 버전 5.3부터는 ereg
더 이상 사용되지 않습니다.
로 이동 ereg
하는 preg_match
것은 패턴의 작은 변화 일뿐입니다.
먼저 코드에 구분 기호를 추가해야합니다. 예 :
ereg('A-Z0-9a-z', 'string');
에
preg_match('/A-Z0-9a-z/', 'string');
들어 eregi
대소 문자를 구분하지 일치 넣어 i
마지막 단락, 예 후 :
eregi('pattern', 'string');
에
preg_match ('/pattern/i', 'string');
답변
구문 ereg()
과 preg_replace()
구문 사이에는 더 많은 차이점이 있습니다 .
-
반환 값 :
- 오류시 : 둘 다 반환
FALSE
- 일치하지 않는 경우 :
ereg()
리턴FALSE
,preg_match()
리턴0
- 경기에 :
ereg()
문자열 길이를 반환하거나1
,preg_match()
항상 반환1
- 오류시 : 둘 다 반환
-
일치하는 부분 문자열의 결과 배열 : 일부 부분 문자열이 전혀 발견되지 않으면 (
(b)
in...a(b)?
)ereg()
결과의 해당 항목은FALSE
이지만 결과preg_match()
는 전혀 설정되지 않습니다.
하나는 변환하는 용감한 정도가 아닌 경우 자신이 ereg()
하는 preg_match()
, 그 또는 그녀가 사용할 수 mb_ereg () PHP 7에서 계속 사용할 수있는.