문제

내 서버의 Apache가 모든 요청을 index.php로 리디렉션하여 다음과 같은 URL을 사용할 수 있도록 구성되었습니다.

http://www.website.com/about/us

이제 각 경로가 존재하는지 확인하려면 URL을 구문 분석해야합니다. 따라서 경로를 저장하기 위해 데이터베이스 테이블을 설정할 수 있으므로 고객이 원하는대로 경로를 편집 할 수 있습니다. 문제는 지금까지 구문 분석 할 수 없다는 것입니다.

내 코드는 다음과 같습니다.

$uri = 'about/us';
$regex = '(page(/<action>))';
if ( ! preg_match($regex, $uri, $matches)) {
    echo 'the route doesn\'t match';
    exit();
}

항상 그 에코 메시지가 나타납니다. 내가 뭘 잘못하고 있죠?

편집하다 :

Regex가 필요한 이유는 다음과 같습니다. 다음과 같은 URL 세그먼트가 있다고 상상해보십시오.

/user/yoda

여기서 Regex는 첫 번째 인수를 동작이나 페이지로 구문 분석하는 데 유용 할 것이며, 두 번째는 내가 기대하고 싶은 경우에만 일치하는 것처럼 특정 숯 세트 만 허용하는 열쇠로 유용합니다. "_-azaz09", 이와 같은 것. 다시 말해, 정규식 표현 세트는 URI와 비교하여 URI와 비교하여 URI와 일치하는지 확인하고이를 수행 할 조치를 결정합니다. 폭발 기능을 사용하면 코드의 뒷부분에서 URI 세그먼트를 평가할 수 있습니다. URI와 일치하지 않으면 페이지를 404로 즉시 전달하고 작업을 중단하십시오. 내가 분명하게했는지 모르겠어 ..

도움이 되었습니까?

해결책

정규 표현식을 사용하는 대신, 들어오는 URI를 간단히 나누지 않겠습니까?

$uri = 'about/us';
list($page, $action) = explode('/', $uri);

두 개 이상이 필요한 경우 목록을 제거하기 만하면됩니다.

$pagePath = explode('/', $uri);

그러나 당신이 있다면 주장하다 정규 표현식을 사용하면 다음과 같습니다.

$regex = '#(?P<page>.*)/(?P<action>.*)#';

그러나 $ match에는 이제 포함 된 것을 제외하고는 특별한 것이 없습니다. $matches['page'] 그리고 $matches['action'] -하지만 정말로 필요하면 Youcan 사용 list() 위에서 볼 수 있듯이.


폭발 기능을 사용하면 코드의 뒷부분 URI 세그먼트를 평가할 수 있습니다.

캐릭터 세트에서 페이지가 유효한지 확인하는 대신 유효한 페이지 조회 테이블 목록을 컴파일하고 PHP를 사용하십시오. in_array 정규 표현보다 훨씬 빠른 것은 무엇입니까? URL 세그먼트를 배열로 추출하면 다중 차원 배열을 즉시 검증 할 수 있습니다.

다른 팁

나는 동선이 상징으로 둘러싸여 있어야한다고 생각합니다. 예를 들어 '@(page(/<action>))@'. 예제를 참조하십시오 http://php.net/preg_match

어떤 이유로 짝수를 절대적으로 사용해야한다면 다음을 시도하십시오.

$uri = 'about/us';
$regex = '~(?<path>[^/]+)/(?<action>.+)~';
var_dump($matches);

출력 :

array(5) {
  [0]=>
  string(8) "about/us"
  ["path"]=>
  string(5) "about"
  [1]=>
  string(5) "about"
  ["action"]=>
  string(2) "us"
  [2]=>
  string(2) "us"
}

그러나 이것은 경로 구성 요소가 한 레벨 만 내려갈 때만 작동합니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top