PHP에서 ereg 표현식을 preg로 변환하려면 어떻게해야합니까?


140

이후 POSIX 정규 표현식 (EREG)는 PHP 5.3.0부터 사용되지 않습니다, 나는에 이전 식을 변환하는 쉬운 방법을 알고 싶습니다 PCRE (펄 호환 정규 표현식) (레그)를 .

예를 들어 다음과 같은 정규 표현식이 있습니다.

eregi('^hello world');

식을 preg_match호환 가능한 식 으로 변환하려면 어떻게 해야합니까?

참고 : 이 게시물은 ereg에서 preg 로의 전환과 관련된 모든 게시물의 자리 표시 자 및 관련 질문에 대한 중복 옵션으로 사용됩니다. 이 질문을 닫지 마십시오.

관련 :


2
@ yes123 : 예, 그게 요점입니다. 나도 피곤합니다. 나는 실제로 모든 것을 설명 할 수있는 위키 포스트를 원한다.
netcoder

나는 구식을 구분 기호로 감싸 야하기 때문에 이것을 필요로하지 않는다고 생각합니다. 또한 나는 당신이 이것에 대해 이전에 답변 된 질문을 사용할 수 있다고 생각합니다.
동적

아, 댓글을 읽기 전에 결의에 투표했습니다. 자리 표시 자로서 목적을 달성 할 수는 있지만 그와 같은 역할을 할 수있는 또 다른 오래된 질문이 있습니까?
Wrikken

흠. ereg [php]매우 유용한 결과를 얻지 못합니다. 좋아, 이것에 대한 나의지지를 빌려줄 수있다.
Wrikken

8
여러분, 우리는이 주제에 대해 모두 서로를 가리키는 닫힌 질문을 거의 만들었습니다. 이 속도로 그들은 모두 폐쇄됩니다 :)
Kev

답변:


142

구문의 가장 큰 변화는 구분 기호 추가입니다 .

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

2
멋진 설명! ereg 에서 preg_match 로 변환하는 특수 사례를 추가하고 싶습니다 . 구분 문자가 아닌 구분 기호 만 이스케이프해야합니다 (이미 특수 문자로 작동했기 때문에 이스케이프하지 않으려는 경우) : preg_match ( '/'. str_replace ( '/', '\ /', $ expr). '/', $ str);
Lolito

일치하는 대괄호를 사용하는 경우 예 와 같이 다른 기호를 사용하는 것처럼 "구분 기호와 동일하기 때문에"어떤 문자도 이스케이프 할 필요 가 없습니다/^\/hello/ . (a(b)c)완벽하게 유효하고 구분 된 PCRE입니다. 저는 개인적으로 괄호를 사용 ()하여 첫 번째 캡처 된 경기가 전체임을 상기시킵니다.
암흑의 절대 군 니엣

나는 PHP를 싫어한다는 것을 말할 수 있습니까 ! 공유 웹 호스팅 서버가 새 버전으로 업데이트되고 error_log다음 경고로 가득 차면 이러한 답변을 찾아야합니다 PHP Deprecated: Function ereg() is deprecated in.... 아아!
c00000fd

이것을 변환하는 방법? $ regex = $ e입니다. '((\. [^ \.'. $ e. '] [^'. $ e. '] *) | (\. \. [^'. $ e. '] +) | ([^ \. ] [^ '. $ e.'] *)) '. $ e. '\. \.' . $ e; 단지 / 수정 / 추가하여 그것을 도다 작업을 preg_math합니다
bdalina

32

preg (PHP 5.3.0 현재) 로의 Ereg 대체가 우리에게 유리한 조치였습니다.

Perl 호환 정규 표현식 구문을 사용하는 preg_match는 종종 ereg의 빠른 대안입니다.

ereg 패턴을 preg로 포팅하기위한 4 가지 주요 사항을 알아야합니다.

  1. 구분 기호 추가 (/) :'pattern' => '/pattern/'

  2. 패턴의 일부인 경우 분리 문자를 이스케이프'patt/ern' => '/patt\/ern/'
    하십시오. 프로그래밍 방식으로 다음과 같은 방법으로 달성하십시오.
    $old_pattern = '<div>.+</div>';
    $new_pattern = '/' . addcslashes($old_pattern, '/') . '/';

  3. eregi (대 / 소문자 구분 안 함) : 대 / 소문자 구분없이 'pattern' => '/pattern/i' eregi 기능을 사용하는 경우 새 패턴 끝에 'i'를 추가하면됩니다 ( '/ pattern /').

  4. ASCII 값 : ereg에서 패턴에 숫자를 사용하면 문자의 ASCII를 참조한다고 가정합니다. 그러나 preg에서 숫자는 ASCII 값으로 취급되지 않습니다. 따라서 패턴에 ereg 표현식에 ASCII 값이 포함 된 경우 (예 : 줄 바꾸기, 탭 등) 16 진수로 변환하고 접두사 \ x를 붙입니다.
    Example: 9(tab) becomes \x9 or alternatively use \t.


8

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');

7

구문 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에서 계속 사용할 수있는.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.