Pregunta

Tengo una expresión regular que utilizo para reducir múltiples barras de barras individuales. El propósito es leer una URL que se convierte previamente a un enlace legible por humanos usando mod_rewrite en Apache, así:

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

Esto funciona:

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

Esto no funciona:

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

Tengo que ser capaz de trabajar con cada parámetro url solo, pero en el segundo ejemplo, si exploto la barra trailling, sería devolverme 3 segmentos en lugar de 2 segmentos. Pueda verificar en PHP en su caso, si los parámetros están vacíos, pero como yo estoy usando esa expresión regular, sería bueno si la expresión regular ya cuidar de que para mí, por lo que no tiene que preocuparse por segmento validación.

¿Alguna idea?

¿Fue útil?

Solución

str_replace puede ser más rápido en este caso

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

En segundo lugar: el uso de equipamiento: http://hu.php.net/manual /en/function.trim.php

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

Otros consejos

¿Qué hay de la ejecución de un segundo reemplazar en $ uri?

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

De esta manera se elimina una barra final. Hacerlo todo en uno preg_replace me gana :) Usando ltrim también podría ser una manera de ir (probablemente incluso más rápido).

  

Tengo que ser capaz de trabajar con cada uno   parámetro url solo, pero en la segunda   ejemplo, si exploto la trailling   barra, sería devolverme 3 segmentos   en lugar de 2 segmentos.

Una solución para esto es utilizar preg_split con el tercer argumento establecido en PREG_SPLIT_NO_EMPTY:

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

Esto convierte dobles barras en una cadena a una sola barra, pero la ventaja de este código es que las barras inclinadas en la parte de protocolo de la cadena (http://) se mantienen.

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

se pueden combinar las tres alternativas en una expresión regular

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

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

Es posible dividir la cadena a través de preg_split lugar, saltando la desinfección por completo. Usted todavía tiene que lidiar con los trozos vacíos, sin embargo.

tarde, pero todos estos métodos se retire http:// barras también, 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/');
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top