2010-02-07 15 views
6

Parece un problema fácil de resolver, pero no es tan fácil como parece. Tengo esta cadena en PHP:Expresión regular, reemplace barras múltiples con una sola

////%postname%/ 

Ésta es una URL y no quiero más de una barra en una fila. No quiero quitar las barras por completo.

Esta es la forma en que debe ser similar:

/%postname%/ 

Debido a que la estructura podría tener un aspecto diferente que necesito una preg inteligentes reemplazan expresión regular, creo. Se necesita trabajar con URL como esta:

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

que debe ser convertido a esta:

/%postname%/mytest/test/testing 

Respuesta

16

Aquí van:

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

O:

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

O incluso:

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

Un simple str_replace() también lo hará el truco (si no hay más de dos barras consecutivas):

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

mucho más corta de lo esperado. No pude hacer que fallara. ¡Gracias! –

+4

str_replace no funcionará así. necesitas una función recursiva, creo. (Eche un vistazo a continuación) – Gal

+1

Como Gal dice, el str_replace no funcionará si hay más de dos barras diagonales. El preg_replace funcionará pero la versión de Bart K es mejor porque no coincide con barras sueltas, solo dos o más – meouw

4

Probar:

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

No, eso reemplazará a ''////'' con ''//'' mientras que aquí se necesita una sola barra. –

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

que está utilizando str_replace

+2

Eso no funcionará a menos que cambie _! == 0_ a _! == falso_. Además, no hay necesidad de recurrencia: _while (strpos ($ str, '//')! == falso) {$ str = str_replace ('//', '/', $ str); } return $ str; _ – GZipp

+0

@GZipp, tienes razón, lo edité. Hasta donde yo sé, no hay diferencia en el rendimiento entre la función recursiva y el ciclo while (pero con mucho gusto se probaría lo contrario). – Gal

3

Tarde pero todos estos métodos eliminarán también las barras http://, pero esto.

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

Mi solución:

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