PHP - уменьшить количество косых черт до одного - PullRequest
1 голос
/ 04 февраля 2010

У меня есть регулярное выражение, которое я использую для сокращения нескольких слешей до одиночных. Цель состоит в том, чтобы прочитать URL-адрес, который ранее был преобразован в удобочитаемую ссылку, используя mod_rewrite в apache, например:

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

Это работает:

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

Это не работает:

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

Мне нужно иметь возможность работать с каждым параметром url по отдельности, но во втором примере, если я взорву косую черту, я получу 3 сегмента вместо 2 сегментов. Я могу проверить в PHP, если таковые имеются, если параметры пусты, но, поскольку я использую это регулярное выражение, было бы хорошо, если бы регулярное выражение уже позаботилось об этом для меня, чтобы мне не приходилось беспокоиться о сегменте проверка.

Есть мысли?

Ответы [ 7 ]

7 голосов
/ 04 февраля 2010

str_replace может быть быстрее в этом случае

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

Во-вторых: используйте отделку: http://hu.php.net/manual/en/function.trim.php

$uri = trim($uri,"/");
2 голосов
/ 09 ноября 2014

Это преобразует двойную косую черту в строке в одну косую черту, но преимущество этого кода в том, что косые черты в части протокола (http://) сохраняются.

preg_replace("#(^|[^:])//+#", "\\1/", $str);
2 голосов
/ 04 февраля 2010

Мне нужно уметь работать с каждым параметр url один, но во втором Например, если я взорвать трейлинг косая черта, он бы вернул мне 3 сегмента вместо 2 сегментов.

Одним из решений этой проблемы является использование preg_split с третьим аргументом, установленным на PREG_SPLIT_NO_EMPTY:

$uri = '/about//me';
$uri_segments = preg_split('#/#', $uri, PREG_SPLIT_NO_EMPTY);
// $uri_segments[0] == 'about';
// $uri_segments[1] == 'me';
2 голосов
/ 04 февраля 2010

Как насчет запуска второй замены на $ uri?

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

Таким образом удаляется косая черта. Делать все это в одном preg_replace меня побеждает :) Использование ltrim также может помочь (возможно, даже быстрее).

1 голос
/ 30 марта 2014

Поздно, но все эти методы удаляют также http:// косые черты, но это.

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/');
1 голос
/ 04 февраля 2010

Вы можете объединить все три альтернативы в одно регулярное выражение

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

print_r(
     preg_replace('~^/+|/+$|/(?=/)~', '', $urls)
);
1 голос
/ 04 февраля 2010

Вместо этого вы можете разделить строку с помощью preg_split, полностью пропустив очистку.Тем не менее, вам все равно придется иметь дело с пустыми кусками.

...