2010-02-07 7 views
6

Cela semble être un problème facile à résoudre, mais ce n'est pas aussi simple qu'il n'y paraît. J'ai cette chaîne en PHP:Expression régulière, remplacez plusieurs barres obliques par une seule

////%postname%/ 

Ceci est une URL et je ne veux jamais plus d'une barre oblique dans une rangée. Je ne veux jamais supprimer complètement les barres obliques.

Voici comment cela devrait ressembler à:

/%postname%/ 

Parce que la structure pourrait être différente je besoin d'un preg intelligent remplacer regexp, je pense. Il faut travailler avec URLS comme ceci:

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

qui devrait être converti en ceci:

/%postname%/mytest/test/testing 

Répondre

16

vous allez ici:

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

Ou:

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

Ou encore:

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

Un simple str_replace() également faire l'affaire (s'il n'y a pas plus de deux barres obliques consécutives):

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

Beaucoup plus court que prévu. Je ne pouvais pas le faire échouer. Merci! –

+4

str_replace ne fera pas comme ça. vous avez besoin d'une fonction récursive je crois. (regardez ci-dessous) – Gal

+1

Comme le dit Gal, le str_replace ne fonctionnera pas s'il y a plus de deux barres obliques. Le preg_replace fonctionnera mais la version de Bart K est meilleure parce qu'elle ne correspond pas à des barres obliques simples, juste deux ou plus – meouw

4

Essayez:

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

Non, cela remplacera ''////'' par '' // ''alors qu'une simple barre oblique est nécessaire ici. –

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

qui est à l'aide str_replace

+2

Cela ne fonctionnera que si vous changez _! == 0_ en _! == false_. De plus, il n'y a pas besoin de récursivité: _while (strpos ($ str, '//')! == false) {$ str = str_replace ('//', '/', $ str); } return $ str; _ – GZipp

+0

@GZipp, tu as raison, je l'ai édité. Pour autant que je sache, il n'y a pas de différence de performance entre la fonction récursive et la boucle while (mais je pourrais volontiers prouver autrement). – Gal

3

Late, mais toutes ces méthodes vont supprimer http:// slashes aussi, mais cela.

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

Ma solution:

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