문제

여러 슬래시를 단일 슬래시로 줄이는 데 사용하는 정규 표현이 있습니다. 목적은 다음과 같이 Apache에서 mod_rewrite를 사용하여 이전에 인간 읽기 가능한 링크로 변환 된 URL을 읽는 것입니다.

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

이것은 작동합니다 :

$uri = 'about//me';
$uri = preg_replace('#//+#', '/', $uri);
echo $uri; // echoes 'about/me'

이것은 작동하지 않습니다 :

$uri = '/about//me';
$uri = preg_replace('#//+#', '/', $uri);
echo $uri; // echoes '/about/me'

각 URL 매개 변수만으로 만 작업 할 수 있어야하지만 두 번째 예에서는 Trailling 슬래시를 폭발하면 2 개의 세그먼트 대신 3 개의 세그먼트를 반환합니다. 매개 변수가 비어있는 경우 PHP에서 확인할 수 있지만, 정규 표현식을 사용하므로 정규 표현이 이미 나에게 처리하는 경우 좋을 것입니다. 그래서 세그먼트에 대해 걱정할 필요가 없습니다. 확인.

이견있는 사람?

도움이 되었습니까?

해결책

이 경우 str_replace가 더 빠를 수 있습니다

$uri = str_replace("//","/",$uri)

둘째 : 트림 사용 : http://hu.php.net/manual/en/function.trim.php

$uri = trim($uri,"/");

다른 팁

$ URI에서 두 번째 교체를 실행하는 것은 어떻습니까?

$uri = preg_replace('#^/#', '', $uri);

그렇게하면 후행 슬래시가 제거됩니다. 하나의 preg_replace에서 모든 것을하는 것은 나를 이겼다 :) ltrim을 사용하는 것은 또한 갈 수있는 방법이 될 수있다 (아마도 더 빨리).

각 URL 매개 변수만으로 만 작업 할 수 있어야하지만 두 번째 예에서는 Trailling 슬래시를 폭발하면 2 개의 세그먼트 대신 3 개의 세그먼트를 반환합니다.

이것에 대한 한 가지 수정 사항은 세 번째 인수와 함께 preg_split을 사용하는 것입니다. PREG_SPLIT_NO_EMPTY:

$uri = '/about//me';
$uri_segments = preg_split('#/#', $uri, PREG_SPLIT_NO_EMPTY);
// $uri_segments[0] == 'about';
// $uri_segments[1] == 'me';

이것은 문자열의 이중 슬래시를 단일 슬래시로 변환하지만이 코드의 장점은 문자열의 프로토콜 부분의 슬래시가 (http://) 보관됩니다.

preg_replace("#(^|[^:])//+#", "\\1/", $str);

세 가지 대안을 모두 하나의 Regexp로 결합 할 수 있습니다

$urls = array(
   'about/me',
   '/about//me',
   '/about///me/',
   '////about///me//'
);

print_r(
     preg_replace('~^/+|/+$|/(?=/)~', '', $urls)
);

문자열을 통해 분할 될 수 있습니다 preg_split 대신, 소독을 완전히 건너 뛰십시오. 그래도 빈 덩어리를 다루어야합니다.

늦었지만이 모든 방법이 제거됩니다 http:// 슬래시도 있지만 이것.

function to_single_slashes($input) {
    return preg_replace('~(^|[^:])//+~', '\\1/', $input);
}

# out: http://localhost/lorem-ipsum/123/456/
print to_single_slashes('http:///////localhost////lorem-ipsum/123/////456/');
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top