PHP - уменьшить количество косых черт до одной

StackOverflow https://stackoverflow.com/questions/2200811

  •  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/');
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top