PHP - уменьшить количество косых черт до одной
-
18-09-2019 - |
Вопрос
У меня есть регулярное выражение, которое я использую, чтобы уменьшить количество косых черт до одной.Цель состоит в том, чтобы прочитать 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, если таковые имеются, если параметры пусты, но поскольку я использую это регулярное выражение, было бы неплохо, если бы регулярное выражение уже позаботилось об этом за меня, чтобы мне не нужно было беспокоиться о проверке сегмента.
Есть какие-нибудь мысли?
Решение
str_replace в этом случае может быть быстрее
$uri = str_replace("//","/",$uri)
Во-вторых:используйте обрезку: http://hu.php.net/manual/en/function.trim.php
$uri = trim($uri,"/");
Другие советы
Как насчет запуска второй замены в $uri?
$uri = preg_replace('#^/#', '', $uri);
Таким образом, завершающая косая черта будет удалена.Выполнение всего этого в одном preg_replace превосходит меня :) Использование ltrim также может быть выходом (возможно, даже быстрее).
Мне нужно иметь возможность работать с каждым параметром 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';
Это преобразует двойные косые черты в строке в одинарные, но преимущество этого кода состоит в том, что косые черты в протокольной части строки (http://
) хранятся.
preg_replace("#(^|[^:])//+#", "\\1/", $str);
вы можете объединить все три альтернативы в одно регулярное выражение
$urls = array(
'about/me',
'/about//me',
'/about///me/',
'////about///me//'
);
print_r(
preg_replace('~^/+|/+$|/(?=/)~', '', $urls)
);
Вы можете разделить строку с помощью preg_split
вместо этого вообще пропускаем дезинфекцию.Однако вам все равно придется иметь дело с пустыми кусками.
Поздно, но все эти методы удалят 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/');