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

이후 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 가지 주요 사항을 알아야합니다.

  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.


답변

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


답변