PHP - tek bir bölü birden eğik azaltmak

6 Cevap php

Ben tek bölü birden fazla eğik azaltmak için kullanmak normal bir ifade var. Amacı daha önce bu gibi apache mod_rewrite kullanan bir insan okunabilir linke dönüştürülür bir url okumak için:

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

Bu çalışır:

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

Bu işe yaramazsa:

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

Ben yalnız her url parametresi ile çalışmak gerekiyor, ama ben trailling çizgi patlayabilir eğer, ikinci örnekte, o bana 3 segmentleri yerine 2 segmentleri dönecekti. Düzenli ifade zaten benim için dikkat eğer ben segment hakkında endişelenmenize gerek yok ki, parametreler boş ise ben eğer herhangi bir PHP doğrulayabilir, ama ben düzenli ifadeyi kullanıyorum gibi, çok güzel olurdu doğrulama.

Herhangi bir düşünce?

6 Cevap

str_replace bu durumda daha hızlı olabilir

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

İkincisi: kullanım Döşeme: http://hu.php.net/manual/en/function.trim.php

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

Nasıl bir ikinci $ URI yerine çalışan hakkında?

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

That way a trailing slash is removed. Doing it all in one preg_replace beats me :) Using ltrim could also be a way to go (probably even faster).

I need to be able to work with each url parameter alone, but in the second example, if I explode the trailling slash, it would return me 3 segments instead of 2 segments.

Bunun bir düzeltme PREG_SPLIT_NO_EMPTY ayarlanmış üçüncü argüman preg_split kullanmaktır:

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

Bir regexp içine tüm üç alternatifleri birleştirebilirsiniz

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

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

Sen tamamen sanitizasyonunun atlama, yerine preg_split yoluyla dize bölünmüş olabilir. Ancak yine de, boş parçalar ile uğraşmak zorunda.

Geç ama tüm bu yöntemler http:// çok bölü kaldırmak, ancak bu olacaktır.

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/');