Kembalikan string tanpa trailing slash

196

Saya punya dua variabel:

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

Saya ingin melakukan sesuatu seperti ini

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

Bagaimana saya melakukan ini?

Ryan
sumber

Jawaban:

479

Coba ini:

function someFunction(site)     
{     
    return site.replace(/\/$/, "");
} 
Chandu
sumber
122
Untuk menangani return site.replace(/\/+$/, "");
kasing
13
"/".replace(/\/$/," ") akan menjadi" ". "/" adalah jalur yang valid dan tidak boleh dilucuti.
puchu
79
function stripTrailingSlash(str) {
    if(str.substr(-1) === '/') {
        return str.substr(0, str.length - 1);
    }
    return str;
}

Catatan: IE8 dan yang lebih lama tidak mendukung offset substruktur negatif. Gunakan str.length - 1sebaliknya jika Anda perlu mendukung browser kuno itu.

Pencuri
sumber
Sangat suka menggunakan istilah 'kuno' di sini.
PageSource
48

ES6 / ES2015 menyediakan API untuk menanyakan apakah sebuah string diakhiri dengan sesuatu, yang memungkinkan penulisan fungsi yang lebih bersih dan lebih mudah dibaca.

const stripTrailingSlash = (str) => {
    return str.endsWith('/') ?
        str.slice(0, -1) :
        str;
};
Seth Holladay
sumber
3
solusi terbaik di 2019 🤙
Paul Rad
@ PaulRad Saat menggunakan soln ini, mendapatkan masalah str.slice (0, -1) cabang tidak tercakup untuk baris ini pada unit test. Bagaimana cara memperbaikinya?
Bijay Rai
30

Saya akan menggunakan ekspresi reguler:

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

Anda akan ingin memastikan bahwa variabel site adalah string.

ChronosLLC
sumber
3
Saya setuju sepenuhnya, setiap kali Anda menulis regex, itu harus dibungkus dengan fungsi dengan nama deskriptif atau dengan komentar.
Eric Labashosky
12

Cuplikan ini lebih akurat:

str.replace(/^(.+?)\/*?$/, "$1");
  1. Itu tidak menghapus /string, karena ini url yang valid.
  2. Ini strip string dengan beberapa garis miring.
1ven
sumber
Meskipun ini mungkin pendekatan yang valid untuk menghapus banyak garis miring, itu bukan permintaan OP.
Jon L.
@JonL. Banyak orang menelusuri stack overflow untuk menemukan jawabannya. Saya menemukan jawaban ini bermanfaat daripada jawaban yang diterima.
Ronnel Martinez
@JonL. Banyak orang menelusuri stack overflow untuk menemukan jawabannya. Saya menemukan jawaban ini bermanfaat daripada jawaban yang diterima.
Ronnel Martinez
10

Saya tahu pertanyaannya adalah mengenai trailing slash tetapi saya menemukan posting ini selama pencarian saya untuk memangkas slash (baik di bagian ekor maupun kepala string literal), karena orang akan membutuhkan solusi ini saya memposting satu di sini:

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

PEMBARUAN :

seperti @Stephen R disebutkan dalam komentar, jika Anda ingin menghapus garis miring dan garis miring terbalik di bagian ekor dan kepala string literal, Anda akan menulis:

'\/\\/\/I am free\\///\\\\'.replace(/^[\\/]+|[\\/]+$/g, '') // returns 'I am free'
vdegenne
sumber
Ini jawaban yang sebenarnya!
Bisakah PERK
1
Jika Anda ingin memangkas kedua garis miring dan garis miring terbalik:.replace(/^[\\/]+|[\\/]+$/g, '')
Stephen R
2

Cara termudah yang saya tahu adalah ini

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

Ini kemudian akan memeriksa a / di akhir dan jika ada menghapusnya jika tidak akan mengembalikan string Anda seperti sebelumnya

Hanya satu hal yang saya belum bisa mengomentari @ThiefMaster wow Anda tidak peduli tentang memori apakah Anda lol runnign substr hanya untuk jika?

Memperbaiki pendidikan untuk indeks berbasis nol pada string.

Barkermn01
sumber
2

Berikut contoh url kecil.

var currentUrl = location.href;

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

catat url baru

console.log(currentUrl);
DevJ3rry
sumber
2

Berdasarkan jawaban @vdegenne ... cara menghapus:

Garis miring tunggal:

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

Garis miring tunggal atau berturut-turut:

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

Slash tunggal terkemuka:

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

Garis miring tunggal atau berturut-turut:

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

Garis miring utama dan belakang tunggal:

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

Garis miring pertama dan berturut-turut:

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

Untuk menangani keduanya garis miring dan kembali garis miring, ganti contoh \/dengan[\\/]

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

solusi lain.

Доширак
sumber
-11
function someFunction(site) {
  if (site.indexOf('/') > 0)
    return site.substring(0, site.indexOf('/'));
  return site;
}
josh.trow
sumber
2
subtring? Selain itu, menghapus garis miring pertama dan semuanya setelahnya.
Pencuri
@ThiefMaster: Benarkah? Anda tidak tahu maksud saya substring? Juga ya, saya bermaksud menghapus garis miring pertama dan semuanya setelah itu karena memang mengisi tagihan untuk pertanyaan dan contoh data yang diposting.
josh.trow
Yah komentarnya mengatakan dia ingin menghapus garis miring
ThiefMaster
@ThiefMaster: Yang, sesuai dengan contohnya, kode saya tidak.
josh.trow
1
Hanya tidak mengapa tidak menggunakan ini kapan saja jika url berubah menjadi "berkualifikasi penuh" memiliki http: // ini tidak akan berfungsi dan tautan apa pun dengan / di tengah tidak akan berfungsi untuk
googler