2010-11-18 7 views
3

PHP에서 URL 라우터를 만들려고합니다. 장고와 비슷합니다.PHP preg_match URL 부분

문제는, 나는 PHP 정규 표현식을 잘 모른다.

I는 다음과 같이 URL을 일치시킬 수 있도록하고 싶습니다 : 배열의 첫 번째 정규식 작동

$urls = array(  
    "(^[/]$)" => "home.index",  
    "/post/(?P<post_id>\d+)/" => "home.post",  
); 

홈에 맞게 :

/post/5/ 
/article/slug-goes-here/ 

나는 정규 표현식에의 배열을 가지고 페이지 /에 있지만 두 번째 작업을 수행 할 수 없습니다. 여기

내가 그들에 맞게 사용하고있는 코드입니다 :

foreach($urls as $regex => $mapper) { 
    if (preg_match($regex, $uri, $matches)) { 
    ... 
    } 
} 

나는 또한 위의 예에서, 내가 URL에 post_id 일치하도록 노력하고 있음을 유의하십시오 : 나는 통과 할 수 있도록 /post/5/5 내 방법에 따라.

+0

정규 표현식에 적절한 구분 기호를해야 – stillstanding

답변

3

정규식을 구분해야합니다. 여기

,/post/(?P<post_id>\d+)/, 

, 내가 쉼표로 정규식을 구분 한 : 구분은 패턴의 일부로서 (예 : 'i'를 대소 문자를 구분 매칭 등) '옵션'을 제공 할 수 있습니다.

당신이 그것을 게시했기 때문에 정규식은 /로 분리되어 있었고 이는 두 번째 이후의 모든 것을 '옵션'으로 처리하고 "게시물"부분 만 일치 시키려고한다는 것을 의미합니다.

일치하는 예는 현재 정규 표현식을 기반으로 한 실제가 아닌 것과 같습니다.

다음과 같은 정규 표현식을 사용한 경우; 그런 다음

/post/P1234/ 

, 다음 사항 :

편집

을 위해 그것을 정리할

Array 
(
    [0] => /post/P1234/ 
    [1] => P1234 
) 

희망 :

preg_match(',/post/(P\d+)/,', '/post/P1234/', $matches); 
print_r($matches); 

가 발생합니다 당신의 영업 이익에 대한 의견을 바탕으로3210

, 당신은 단지 URL의/후/부품 다음의 숫자를 일치 시키려면, 그래서이 약간 단순화 된 버전 :

preg_match(',/post/(\d+)/,', '/post/1234/', $matches); 
print_r($matches); 

이됩니다에서 :

Array 
(
    [0] => /post/1234/ 
    [1] => 1234 
) 
+0

아, 당신은 내 밤을 만들어, 감사합니다! 나는 이것을 위해 20 표를 줄 수 있었으면 좋겠다. – imns

+0

문제는 안된다. 처음 시작했을 때 정규 표현식을 꽤 많이 찔렀다. php.net에서도 정규 표현식을 설명하지 않았다. –

1

이 두 번째 정규식이 글 /과 같은 URL을 일치하기위한 것입니다 경우/슬러그는 - - 여기 간다/후 올바른 정규 표현식을해야

#\/article\/[\w-]+\/# 

입니다! 나는 /를 벗어나지 않아야한다는 것에 대해 확신하지 못하기 때문에, 당신은 그들을 벗어나지 않고 시도 할 수 있습니다. .NET 추측 태그는 해당 프레임 워크가 이러한 태그를 사용하여 일치하는 그룹의 이름을 지정하기 때문에 .NET 예제에서 추출됩니다.

내가 도움이되기를 바랍니다.