2012-02-02 3 views
0

컨트롤러의 MVC 작업과 다른 URL을 일치 시키려고합니다.정규 표현식이 예상 URL과 일치하지 않습니다.

/products/22-test/25-test2 

내가 (으로, preg_match_all를 통해) 다음과 같은 결과를 얻기 위해 기다리고 있었다 : 내가이 일치 할 때

#^/products((/([0-9]+)-([0-9a-z\_]+))*(/(index\.(html|pdf|xml|json))?)?)?$#i 

: 여기

내가 테스트하고있어 현재의 표현이다

array(5) { 
    [0]=> 
    string(26) "/products/22-test/25-test2" 
    [1]=> 
    string(17) "/22-test" 
    [2]=> 
    string(2) "22" 
    [3]=> 
    string(5) "test" 
    [4]=> 
    string(17) "/25-test" 
    [5]=> 
    string(2) "25" 
    [6]=> 
    string(5) "test2" 
} 

하지만 그 대신 내가 얻을

array(5) { 
    [0]=> 
    string(26) "/products/22-test/25-test2" 
    [1]=> 
    string(17) "/22-test/25-test2" 
    [2]=> 
    string(9) "/25-test2" 
    [3]=> 
    string(2) "25" 
    [4]=> 
    string(5) "test2" 
} 

UPDATE

문제는 내가 사용하고 난 가능한 한 내 문제가 명확하게 단지 있도록 개별 요소로 변환 카테고리 목록 ...

을받지 못했습니다이다 (/([0-9]+)-([0-9a-z\_]+))*은 많은 범주 식별자를 구문 분석 된 항목으로 변환하려고 시도합니다. 그 이유는 내가 (...)*을 사용했기 때문에 어떤 수의 카테고리도 일치해야하며 각각 일치해야합니다.

업데이트 2

그것은, 내가 (...)* 대신 나에게 하나 개의 큰 목록을주는 여러 번 구문 분석 것이라고 내가 몇 번을 같은 범주 식별자를 지원하는 정규 표현식을 업데이트 할 경우,이 구문 분석됩니다 것으로 기대했다 보인다 카테고리 식별자의.

#^/products((/([0-9]+)-([0-9a-z\_]+))?(/([0-9]+)-([0-9a-z\_]+))?(/([0-9]+)-([0-9a-z\_]+))?(/([0-9]+)-([0-9a-z\_]+))?(/([0-9]+)-([0-9a-z\_]+))?(/(index\.(html|pdf|xml|json))?)?)?$#i 

을하지만 카테고리 선택 여러 번 반복 저를 강제로 :

는 예를 들어,이 잘 작동합니다. 따라서 카탈로그에 X 카테고리 이상을두기로 결정한 고객이있는 경우 차단되고 URL이 올바르게 해결되지 않습니다.

지원 방법이 있습니까?

+0

'# ^/제품 ((/ ([0-9] +) - ([0-9a-z \ _ \ -] +)) * (/ (색인 \ (html | pdf | xml | json))?)?)?$ # 나는 그것을 시도한다 – RobertPitt

+0

아니, 나는 그것을 어떻게해서든지 시도했지만 \ wouldnt는 그것을 바꾼다. 문제는 내가 개별 목록으로 번역 된 카테고리 목록을 얻지 못한다는 것입니다. –

+0

망할 것 같았습니다 ... 나는 여러 번 카테고리 선택기를 반복해야합니다. 그래서 나는 내 고객이 결코 X 카테고리 이상을 사용하지 않거나 일을 멈추지 않기를 바랄뿐입니다 ... 다른 방법이 있습니까? –

답변

2

결과는 위치입니다. 나는. 위치 1은 첫 번째 ()을 캡처하고 위치 2는 ()의 두 번째 세트를 캡처합니다.

*은 캡처 그룹을 으로 확대하고으로 지정하지만 위치를 증가시키지 않습니다.

두 번째 단계에서 (/([0-9]+)-([0-9a-z\_]+))과 함께 "findall"을 사용하는 첫 번째 그룹으로 나눌 수 있습니다.

+0

선택자, 내가 원하는 것을 얻기위한 다른 방법이 있습니까? –

+0

예. 첫 번째 그룹의'findAll'을 첫 번째 그룹의 정규 표현식 만 사용합니다. –

+0

ok .... shucks ... 내 경로 객체를 크게 바꾼다. 나는 그것을 재검토해야 할 것이다. 나는 팝업을 할 수있는 다른 솔루션이 있는지를 기다릴 것이다. 그러나 지금까지 유일한 해결책 인 것 같다 ... –

0

얻기 위해이 코드를 고려 개별 카테고리 ID와 이름 :

$str = '/products/22-test/25-test2'; 
if (stripos($str, "/products/") !== false && 
    preg_match_all('#(/(\d+)-([a-z\d_-]+))#i', $str, $m)) 
    print_r($m); 

출력 :

Array 
(
    [0] => Array 
     (
      [0] => /22-test 
      [1] => /25-test2 
     ) 

    [1] => Array 
     (
      [0] => 22 
      [1] => 25 
     ) 

    [2] => Array 
     (
      [0] => test 
      [1] => test2 
     ) 

) 
+0

그것은 당신의 솔루션과 함께 작동 할 것이지만 나의 경우에는 내가 필요한 행동을 탐지하기 위해 일치를 사용하지 않을 것이다. 동시에 부 정보를 실행 및 검출 할 수있다. –

+0

'if (stripos ($ str, "/ products /")! == false && preg_match_all ('# (/ (\ d +) +)) # i ' $ str, $ m))'업데이트 된 대답과 마찬가지로. – anubhava

관련 문제