Question

J'ai une expression régulière que j'utilise pour réduire plusieurs barres obliques à barres obliques simples. Le but est de lire une URL qui est converti précédemment un lien lisible en utilisant mod_rewrite apache, comme ceci:

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

Cela fonctionne:

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

Cela ne fonctionne pas:

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

Je dois être capable de travailler avec chaque paramètre url seul, mais dans le second exemple, si je slash exploser la trailling, il me retourner 3 segments au lieu de 2 segments. Je peux vérifier en PHP le cas échéant si les paramètres est vide, mais comme j'utilise cette expression régulière, ce serait bien si l'expression régulière déjà prendre soin de cela pour moi, pour que je ne ai pas besoin de vous soucier de secteur validation.

Toutes les pensées?

Était-ce utile?

La solution

str_replace peut être plus rapide dans ce cas

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

En second lieu: assiette utilisation: http://hu.php.net/manual /en/function.trim.php

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

Autres conseils

Que diriez-vous d'une deuxième course remplacer le $ uri?

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

De cette façon, on enlève un slash. Faire tout cela dans un preg_replace me bat :) L'utilisation ltrim pourrait aussi être un moyen d'aller (probablement encore plus rapide).

  

Je dois être capable de travailler avec chaque   paramètre url seul, mais dans la deuxième   par exemple, si je le trailling exploserai   slash, il me revenir 3 segments   au lieu de 2 segments.

Une solution pour cela est d'utiliser preg_split avec le troisième argument défini sur PREG_SPLIT_NO_EMPTY:

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

Ceci convertit les barres obliques doubles dans une chaîne à une seule barre oblique, mais l'avantage de ce code est que les barres obliques dans la partie de protocole de la chaîne (http://) sont conservés.

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

vous pouvez combiner les trois alternatives en une seule expression rationnelle

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

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

Vous pouvez diviser la chaîne via preg_split à la place, sauter le désinfectante tout à fait. Il vous reste à traiter les morceaux vides, cependant.

fin, mais toutes ces méthodes va supprimer les barres obliques http:// 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/');
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top