2010-02-07 15 views
6

Çözülmesi kolay bir problem gibi görünüyor, ancak göründüğü kadar kolay değil.Düzenli ifade, birden fazla eğik çizgiyi yalnızca bir tane ile değiştirin

////%postname%/ 

Bu URL ve ben bir satırda birden fazla çizgi istemiyorum: PHP bu dizesi vardır. Kesik çizgileri tamamen kaldırmak istemiyorum. yapı farklı bir akıllı emprenye sanırım, regexp'in yerine ihtiyaç görünebilir Çünkü

/%postname%/ 

:

Bu gibi görünmelidir nasıl. Böyle URL'ler ile çalışmak gerekir: Bu dönüştürülmesi gerekir

////%postname%//mytest/test///testing 

: Burada

/%postname%/mytest/test/testing 

cevap

16

gitmek:

$str = preg_replace('~/+~', '/', $str); 

Veya:

$str = preg_replace('~//+~', '/', $str); 

Ya da:

$str = preg_replace('~/{2,}~', '/', $str); 

Basit str_replace() (en fazla iki ardışık eğik çizgi varsa) da hile olacaktır:

$str = str_replace('//', '/', $str); 
+0

Beklediğimden çok daha kısa. Başarısız hale getiremedim. Teşekkürler! –

+4

str_replace bunu sevmeyecektir. inanıyorum bir özyinelemeye ihtiyacım var. (aşağıya bakın) – Gal

+1

Gal'in dediği gibi, str_replace ikiden fazla eğik çizgi varsa çalışmayacaktır. Preg_replace işe yarayacak, ancak Bart K versiyonu daha iyi, çünkü sadece iki ya da daha fazla – meouw

4

Dene:

echo preg_replace('#/{2,}#', '/', '////%postname%//mytest/test///testing'); 
0
echo str_replace('//', '/', $str); 
+0

Hayır, burada '////' '' // 'ile değiştirilecek, burada tek bir eğik çizgi gereklidir. –

4
function drop_multiple_slashes($str) 
{ 
    if(strpos($str,'//')!==false) 
    { 
    return drop_multiple_slashes(str_replace('//','/',$str)); 
    } 
    return $str; 
} 

kullanıyor str_replace

+2

Bu, _! == 0_ - _! == false_ değiştirmediğiniz sürece çalışmaz. Ayrıca, tekrarlamaya gerek yoktur: _while (strpos ($ str, '//')! == false) {$ str = str_replace ('//', '/', $ str); } $ str; döndürün; _ – GZipp

+0

@GZipp, haklısınız, düzenledim. Bildiğim kadarıyla, özyinelemeli fonksiyon ile döngü arasında performansta bir fark yoktur (ama aksi takdirde memnuniyetle kanıtlanabilirdim). – Gal

3

Geç: Ancak bu yöntemlerin tümü http:// eğik çizgi kaldırır, ancak bu.

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

Çözümümün:

while (strlen($uri) > 1 && $uri[0] === '/' && $uri[1] === '/') { 
    $uri = substr($uri, 1); 
} 
İlgili konular