2011-10-29 2 views
-4

정규 표현식으로 url을 구문 분석하여 요소를 캡처하려고 시도하지만 어떻게해야할지 모르겠다. $ path_ => 어레이 (TYPE => 별장 페이지와 $ path_ => 어레이 (TYPE => 별장) 해결할 복잡한 정규 표현식

  • 위치 별장 P1

    • 위치 별장 : URL 샘플 $ path_ => 어레이 (TYPE => 별장 영역 => R01)
    • 위치 별장 내 부서-D01와 함께 => P1)
    • 위치 별장 내 영역-R01 $ path_ => 배열 (type => 별장, 부서 => d) 01)
    • 위치 별장 내 부서-D01-P1 $ path_ => 배열 (유형 => 별장, 부서 => D01, 페이지 => P1)

    내가 싶습니다와 하나의 정규 표현식으로이 작업을 수행하지만이 작업을 수행 할 것인지 모르겠다.이 작업을 시도한다.

    $expression = '#location-(?P<type>cottage|house)[a-z,-]*'; 
    $expression.= '(?P<region>r[0-9]{2}|)'; 
    $expression.= '(?P<department>d[0-9]{2}\)'; 
    $expression.= '(?P<town>v[0-9]{5}|)'; 
    $expression.= '[-]*(?P<page>[p0-9]*)$#'; 
    preg_match($expression, $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $path_); 
    

    누군가가 나를 도와 줄 수 있습니까?

    • 위치 별장 내 부서-D01-P1 : 그것이 가능하다면 두 번째 부분에서

      , 나는이로, 만 1이 아닌 P1 만 01 아니라 D01을 유지하고 싶습니다 $와
      path_ => 배열 (유형 => 별장, 부서 => 01 페이지 => 1) 대신 문자열을 구문 분석 할 수 있습니다 (대부분의 시나리오에서 많은 대형입니다) 정규 표현식의
  • +0

    URL의 실제 예를 들려 줄 수 있습니까? – Sylverdrag

    +0

    어떤 "요소"를 캡처하고 싶은지 전혀 모르겠습니까? – FailedDev

    +0

    그래서 일부 부품을 선택적으로 만들고 싶습니까? ('?'사용) – mario

    답변

    3

    먼저 #x을 사용하면 정규식을 더 읽기 쉽게 만들 수 있습니다. 그런 다음, 예를 들어 d 캡처 명명 된 캡처 그룹에서 이동, 대신 (?: )?에 포장하지 않으려면

    $expression = <<< RX 
        # 
         location-(?P<type>cottage|house)[a-z,-]* 
         (?P<region> r[0-9]{2}|) ? 
         (?P<department> d[0-9]{2}) ? 
         (?P<town> v[0-9]{5}|) ? 
         [-]*(?P<page> [p0-9]*) ? 
        $#x 
    RX; 
    

    그리고 그런 다음 선택 될 수있는 각 캡처 그룹 뒤에 ?를 사용합니다.

    +0

    고맙습니다. – newbee

    +0

    귀하의 경우에는'(? : [d] (? P [0-9] {2}))? '가됩니다. (''[d]'는 외모를위한 char 클래스로 싸여 있습니다.) – mario

    +0

    대단히 고마워요! – newbee

    2

    list($locationString, $type, $region, $department, $town, $page) = array_pad(explode('-', $path(), null, -6); 
    

    이제 모든 매개 변수의 유효성을 검사하십시오 (누락 된 매개 변수는 null이므로 array_pad() 임). Thats는 더 읽기 쉽지 않지만 나중에 유형을 추가하려는 경우와 같이 나중에 쉽게 수정할 수 있습니다.

    +0

    나는 preg_match를 연속적으로 사용하기 때문에 폭발을 사용하지 않을 것이고이 문제를 해결하고 싶습니다. – newbee

    +0

    번역 : 나는이 복잡한 정규 표현식을 사용하기 위해 수 시간 동안 일했지만, 지금은 포기하지 않을 것입니다 ...';)' –

    +0

    불편을 끼쳐 드려 죄송 합니다만, 몇 시간 동안 잘못된 방향을 들여다 보았습니다. 당신이 할 수 있기 때문에 더 복잡한 해결책을 만드는 것은 해결책이 아닙니다. – KingCrunch