Возврат строки без косой черты

198

У меня есть две переменные:

site1 = "www.somesite.com";  
site2 = "www.somesite.com/";  

Я хочу сделать что-то подобное

function someFunction(site)
{
    // If the var has a trailing slash (like site2), 
    // remove it and return the site without the trailing slash
    return no_trailing_slash_url;
}

Как мне это сделать?

Райан
источник

Ответы:

481

Попробуй это:

function someFunction(site)     
{     
    return site.replace(/\/$/, "");
} 
Chandu
источник
124
Для обработки дел с несколькими return site.replace(/\/+$/, "");
конечными слешами
13
"/".replace(/\/$/," ") будет" ". «/» является допустимым путем, и его не следует удалять.
Пучу
79
function stripTrailingSlash(str) {
    if(str.substr(-1) === '/') {
        return str.substr(0, str.length - 1);
    }
    return str;
}

Примечание. IE8 и более ранние версии не поддерживают отрицательные смещения смещения. Используйте str.length - 1вместо этого, если вам нужно поддерживать эти древние браузеры.

ThiefMaster
источник
Очень нравится использование термина «древний» здесь.
PageSource
48

ES6 / ES2015 предоставляет API для запроса о том, заканчивается ли строка чем-то, что позволяет написать более понятную и читаемую функцию.

const stripTrailingSlash = (str) => {
    return str.endsWith('/') ?
        str.slice(0, -1) :
        str;
};
Сет Холладей
источник
3
лучшее решение в 2019 году
Пол Рад
@PaulRad При использовании этого soln возникает проблема с веткой str.slice (0, -1), которая не покрывается этой строкой в ​​модульном тесте. Как это исправить?
Биджай Рай
1
@BijayRai означает, что в ваших тестах отсутствует случай, в котором strзаканчивается /косая черта. У вас должно быть два утверждения (или два теста), одно с косой чертой и одно без.
Сет Холладей
30

Я бы использовал регулярное выражение:

function someFunction(site)
{
// if site has an end slash (like: www.example.com/),
// then remove it and return the site without the end slash
return site.replace(/\/$/, '') // Match a forward slash / at the end of the string ($)
}

Вы хотите убедиться, что переменная siteявляется строкой.

ChronosLLC
источник
3
Я полностью согласен, всякий раз, когда вы пишете регулярное выражение, оно должно быть заключено в функцию с описательным именем или с комментариями.
Эрик Лабашоски
12

Этот фрагмент более точен:

str.replace(/^(.+?)\/*?$/, "$1");
  1. Он не удаляет /строки, так как это действительный URL.
  2. Удаляет строки с несколькими косыми чертами.
1ven
источник
Хотя это может быть правильным подходом к удалению нескольких слешей, это не запрос OP.
Джон Л.
@JonL. Многие люди просматривают переполнение стека, чтобы найти ответ. Я считаю этот ответ полезным, чем принятый ответ.
Роннел Мартинес
@JonL. Многие люди просматривают переполнение стека, чтобы найти ответ. Я считаю этот ответ полезным, чем принятый ответ.
Роннел Мартинес
11

Я знаю, что вопрос о конечных слешах, но я нашел этот пост во время поиска обрезки (как в хвосте, так и в начале строкового литерала), так как людям понадобится это решение, которое я выкладываю здесь:

'///I am free///'.replace(/^\/+|\/+$/g, ''); // returns 'I am free'

ОБНОВЛЕНИЕ :

как упоминалось в комментариях @Stephen R , если вы хотите удалить как косую черту, так и обратную косую черту как в хвостовой части, так и в начале строкового литерала, вы должны написать:

'\/\\/\/I am free\\///\\\\'.replace(/^[\\/]+|[\\/]+$/g, '') // returns 'I am free'
vdegenne
источник
Это настоящий ответ!
Может ПЕРК
2
Если вы хотите обрезать и косую черту, и обратную косую черту:.replace(/^[\\/]+|[\\/]+$/g, '')
Стивен Р.
3

На основании ответа @vdegenne ... как раздеться:

Одиночная косая черта:

theString.replace(/\/$/, '');

Одиночные или последовательные косые черты:

theString.replace(/\/+$/g, '');

Одиночный ведущий слеш:

theString.replace(/^\//, '');

Одиночные или последовательные ведущие косые черты:

theString.replace(/^\/+/g, '');

Одиночные начальные и конечные слеши:

theString.replace(/^\/|\/$/g, '')

Одиночные или последовательные начальные и конечные слеши:

theString.replace(/^\/+|\/+$/g, '')

Для того, чтобы обрабатывать как слеши и обратные косые черты, заменить экземпляры \/с[\\/]

Стивен Р
источник
2

Легкий способ, который я знаю, это

function stipTrailingSlash(str){
   if(srt.charAt(str.length-1) == "/"){ str = str.substr(0, str.length - 1);}
   return str
}

Затем он проверит наличие символа / на конце и, если он там, удалит его, если он не вернет вашу строку, как это было

Еще одна вещь, которую я пока не могу комментировать. @ThiefMaster Ух ты, ты не заботишься о памяти, не так ли?

Исправлена ​​калькуляция для нулевого индекса в строке.

Barkermn01
источник
2

Вот небольшой пример URL.

var currentUrl = location.href;

if(currentUrl.substr(-1) == '/') {
    currentUrl = currentUrl.substr(0, currentUrl.length - 1);
}

войти новый URL

console.log(currentUrl);
DevJ3rry
источник
1
function stripTrailingSlash(text) {
    return text
        .split('/')
        .filter(Boolean)
        .join('/');
}

другое решение.

Доширак
источник
-11
function someFunction(site) {
  if (site.indexOf('/') > 0)
    return site.substring(0, site.indexOf('/'));
  return site;
}
josh.trow
источник
2
subtring? Кроме того, он удаляет первый слеш и все после него.
ThiefMaster
@ThiefMaster: Действительно? Вы не можете сказать, что я имел в виду substring? Также да, я хотел удалить первую косую черту и все после нее, так как она заполняет счет за опубликованные данные вопроса и примера.
josh.trow
Ну, его комментарий говорит, что он хочет удалить косую черту
ThiefMaster
@ThiefMaster: Что, согласно его примерам, делает мой код.
josh.trow
1
Только почему бы не использовать это в любой момент, если URL-адреса изменяются на «полностью квалифицированные», имеют http: // это не будет работать, а любые ссылки с / в середине не будут работать для googlers
Barkermn01