2017-11-27 16 views
3

그냥 코딩을 시작하고 PHP에서 정규식에 약간의 문제가 있습니다.정규 표현식에서 PHP 정규식 9 문자 유형을

문자열에서 다음 숫자 형식을 잡으려고합니다.

000 000 00 00 - 
000 000 00 0 - 
000 000 00 - 
000.000.00.00 - 
000.000.00.0 - 
000.000.00 - 
0000000000 - 
000000000 - 
00000000 - 

물론 0은 0-9 사이의 숫자를 의미합니다.

$pattern = "/\d{3}[. ]\d{3}[. ]\d{2}[. ]?\d{1-2}?/"; 

뭔가 잘못 여기,하지만 난 이해하지 않습니다

는 패턴 내가 해봤입니까?

도와 주시겠습니까? 숫자를 문자로 접착 또는 _이를 제거 할 수있는 경우 단어 경계 (-

+0

한계 수량은'{1-2}'가 아닌'{1,2}'입니다. –

+0

['\ b \ d {3} ([. \ h]?) \ d {3} \ 1 \ d {2} (? : \ 1 \ d {1,2})? \ b'] (https://regex101.com/r/TneMp5/2) –

+2

무엇이 잘못 되었습니까? 그게 뭐야? 그게 뭐라 구요? 끝 부분의 공간과'-'도 필요합니다. 그것은 당신의 패턴이 아닙니다. – AbraCadaver

답변

4

당신이 regex demo

세부

  • \b를 참조

    /\b\d{3}([.\s]?)\d{3}\1\d{2}(?:\1\d{1,2})?\b/ 
    

    를 사용할 수 있습니다 보인다 또는 (?<!\d)으로 대체)

  • 그룹으로 캡처 선택적 . 또는 공백, 1 또는 0 회, 1
  • \d{3} - - 0
  • \d{3} - 3 자리
  • ([.\s]?) 3 자리
  • \1 - 동일한 값
  • \d{2} 그룹 1과 - 2 숫자
  • (?:\1\d{1,2})? -
    • \1의 선택 순서 - 그룹에서와 같은 값 1
    • \d{1,2} - 1 또는 2 자리
  • \b
  • - 트레일 링 단어 경계 (삭제/실제 요구 사항에 따라 (?!\d) 교환). 패턴 주위에 작은 따옴표

    $contents = file_get_contents('test.txt'); 
    $pattern = '/\b\d{3}([.\s]?)\d{3}\1\d{2}(?:\1\d{1,2})?\b/'; 
    preg_match_all($pattern, $contents, $results); 
    print_r($results); 
    

    마음이 : PHP에서

대신 큰 따옴표를 사용하는 경우, 당신은 (적어도 \1로) 백 슬래시를 두 배로해야합니다 "\1" 때문에는 문자와 정의 8 진수 1은 '\1'은 백 슬래시로, 1으로 해석됩니다.