Sondaki eğik çizgi olmadan dönüş dizesi


198

İki değişkenim var:

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

Böyle bir şey yapmak istiyorum

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;
}

Bunu nasıl yaparım?


Yanıtlar:


481

Bunu dene:

function someFunction(site)     
{     
    return site.replace(/\/$/, "");
} 

124
Birden fazla sondaki eğik çizgi bulunan vakaları işlemek için şunları kullanabilirsiniz:return site.replace(/\/+$/, "");
mikermcneil

13
"/".replace(/\/$/," ")" "olacaktır. "/" geçerli bir yoldur ve soyulmamalıdır.
puchu

79
function stripTrailingSlash(str) {
    if(str.substr(-1) === '/') {
        return str.substr(0, str.length - 1);
    }
    return str;
}

Not: IE8 ve üstü negatif altstr ofsetleri desteklemez. Kullan str.length - 1o eski tarayıcıları desteklemek için gerekirse bunun yerine.


Gerçekten burada 'eski' teriminin kullanımı gibi.
SayfaKaynak

48

ES6 / ES2015, bir dizenin bir şeyle bitip bitmediğini sormak için bir API sağlar, bu da daha temiz ve daha okunabilir bir işlev yazmayı sağlar.

const stripTrailingSlash = (str) => {
    return str.endsWith('/') ?
        str.slice(0, -1) :
        str;
};

3
2019'da en iyi çözüm 🤙
Paul Rad

@PaulRad Bu çözümü kullanırken, birim testinde bu satır için kapsanmayan str.slice (0, -1) dalının yayınlanması. Bunu nasıl düzeltirim?
Bijay Rai

1
@BijayRai, testlerinizin eğik çizgi strile bittiği bir vakanın eksik olduğu anlamına gelir /. Biri eğik ve diğeri olmayan iki iddia (veya iki test) olmalıdır.
Seth Holladay

30

Normal bir ifade kullanırdım:

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 ($)
}

siteYine de, değişkenin bir dize olduğundan emin olmak istersiniz .


3
Tamamen katılıyorum, regex yazdığınızda, açıklayıcı bir isim veya yorumlarla bir fonksiyona sarılmalıdır.
Eric Labashosky

12

Bu pasaj daha doğrudur:

str.replace(/^(.+?)\/*?$/, "$1");
  1. Şerit değil / geçerli bir URL yöntem olduğu dizeleri.
  2. Birden fazla sondaki eğik çizgi içeren telleri şeritler.

Bu, çoklu eğik çizgileri kaldırmak için geçerli bir yaklaşım olsa da, OP'nin isteği bu değildir.
Jon L.

@JonL. Birçok kişi yanıt bulmak için yığın taşmasına göz atar. Bu cevabı kabul edilen cevaptan daha yararlı buluyorum.
Ronnel Martinez

@JonL. Birçok kişi yanıt bulmak için yığın taşmasına göz atar. Bu cevabı kabul edilen cevaptan daha yararlı buluyorum.
Ronnel Martinez

11

Sorunun sondaki eğik çizgilerle ilgili olduğunu biliyorum, ancak bu gönderiyi eğik çizgiler (hem kuyrukta hem de bir dize değişmezinin başında) için arama sırasında buldum, insanlar bu çözüme ihtiyaç duyacağım için burada bir tane gönderiyorum:

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

GÜNCELLEME :

olarak @Stephen R yorum olarak bahsedilen her iki eğik çizgi ve kuyruk ve dize başında tersbölüleri hem kaldırmak istiyorsanız, şu yazılır:

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

Bu gerçek cevap!
PERK

2
Hem eğik çizgileri hem de ters eğik çizgileri kırpmak istiyorsanız:.replace(/^[\\/]+|[\\/]+$/g, '')
Stephen R

3

@Vdegenne'nin cevabına göre ... nasıl şeritlenir:

Tek sondaki eğik çizgi:

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

Tek veya art arda sondaki eğik çizgiler:

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

Tekli eğik çizgi:

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

Tek veya art arda gelen eğik çizgiler:

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

Tekli önde ve arkadaki eğik çizgiler:

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

Tek veya art arda gelen ön ve arka eğik çizgiler:

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

Hem eğik çizgileri hem de ters eğik çizgileri işlemek \/için[\\/]


2

Bildiğim kolaylıklar bu

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

Bu daha sonra sonunda bir / olup olmadığını kontrol eder ve eğer varsa dizesini olduğu gibi döndürürse kaldırır

Ben henüz yorum yapamıyorum Sadece bir şey @ThiefMaster vay bellek umurumda değil lol sadece bir if için bir substr runnign?

Dizede sıfır temelli dizin için hesaplama düzeltildi.


2

Burada küçük bir url örneği.

var currentUrl = location.href;

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

yeni url'yi günlüğe kaydet

console.log(currentUrl);

1
function stripTrailingSlash(text) {
    return text
        .split('/')
        .filter(Boolean)
        .join('/');
}

başka bir çözüm.


-11
function someFunction(site) {
  if (site.indexOf('/') > 0)
    return site.substring(0, site.indexOf('/'));
  return site;
}

2
subtring? Bunun yanı sıra, ilk eğik çizgiyi ve bundan sonraki her şeyi kaldırır.
ThiefMaster

@ThiefMaster: Gerçekten mi? Demek istediğimi söyleyemez substringmisin? Ayrıca evet, ilk eğik çizgiyi ve sonrasındaki her şeyi kaldırmak istedim, çünkü gönderilen soru ve örnek veriler için faturayı dolduruyor.
josh.trow

Peki yorumu, sondaki eğik çizgiyi kaldırmak istediğini söylüyor
ThiefMaster

@ThiefMaster: Hangi, onun örneklerine göre, benim kod yapar.
josh.trow

1
// Bu alışkanlık iş ve orta alışkanlık çalışmalarında / ile tüm bağlantılar: URL'ler var http "tam nitelikli" olarak değiştirirseniz Sadece bir neden herhangi bir noktada bu kullanmamayı değil Google'cuların için
Barkermn01
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.