Я хотел бы определить с помощью php
если строка типа $string
содержит повторяющиеся конечные косые черты.
Например:
$string = "http://somepage.com/something/some.html/////";
в
$string = "http://somepage.com/something/some.html";
И я хочу сделать, if
, если у него есть дубликат, что-то вроде:
If ($string = "http://somepage.com/something/some.html/////";) { remove extra trailing slashes } //else do nothing...
Вы можете просто использовать rtrim()
:
$string = rtrim($string, '/');
Если вы по какой-то причине хотите сначала проверить, есть ли у нее косые черты, тогда вы можете проверить последний символ, например:
if ($string[ strlen($string)-1 ] === '/') { $string = rtrim($string, '/'); }
Выбрасывание строки через rtrim()
не дорого, поэтому вам не нужно сначала проверять следы слэш.
Использование регулярных выражений для обрезки конечных косых черт немного завышено.
применять rtrim
так
$string = rtrim($string, '/');
$string = rtrim($string, '/');
rtrim
– лучшее решение, но так как вы отметили regex
для полноты:
$string = "http://somepage.com/something/some.html/////"; echo preg_replace('#/+$#','',$string); >>> http://somepage.com/something/some.html
# - Is the delimiter character /+ - Matches one or more forward slash $ - Matches the end of the string # - Delimiter Replace with '' - Nothing (empty string)
Есть места, где /
можно дублировать, например, вы можете получить доступ к своему вопросу через все эти ссылки:
Единственный double /
который делает здесь различие, это http://
, поэтому давайте рассмотрим его. rtrim
большинстве случаев я не могу работать с rtrim
, поэтому давайте перейдем к регулярным выражениям.
$parts = explode('//', $full_url, 2); $parts[1] = rtrim(preg_replace('@/+@', '/', $parts[1]), '/'); $full_url = implode('//', $parts); unset($parts);
Онлайн-тест: http://ideone.com/1qHR9o
Before: https://stackoverflow.com/questions/13990256/remove-duplicate-trailing-slashes/ After: https://stackoverflow.com/questions/13990256/remove-duplicate-trailing-slashes --------------------- Before: https://stackoverflow.com/questions/13990256/remove-duplicate-trailing-slashes//// After: https://stackoverflow.com/questions/13990256/remove-duplicate-trailing-slashes --------------------- Before: https://stackoverflow.com///questions///13990256///remove-duplicate-trailing-slashes//// After: https://stackoverflow.com/questions/13990256/remove-duplicate-trailing-slashes --------------------- Before: https://stackoverflow.com/questions//13990256/remove-duplicate-trailing-slashes// After: https://stackoverflow.com/questions/13990256/remove-duplicate-trailing-slashes ---------------------
Из вашего вопроса я понимаю, что вы всегда получаете полный URL-адрес, поэтому мы можем разделить его на две части:
$parts = explode('//', $full_url, 2);
Теперь мы удалим дублированный /
с:
preg_replace('@/+@', '/', $parts[1])
Затем мы удаляем добавочный /
из конца строки:
$parts[1] = rtrim( /*previous line*/ , '/');
И взорвать его обратно:
$full_url = implode('//', $parts); unset($parts);