ส่งคืนสตริงโดยไม่มีเครื่องหมายสแลชต่อท้าย


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(/\/$/, "");
} 

124
ในการจัดการเคสที่มีหลายสแลชคุณสามารถใช้:return site.replace(/\/+$/, "");
mikermcneil

13
"/".replace(/\/$/," ") จะเป็น" " "/" เป็นเส้นทางที่ถูกต้องและไม่ควรถูกถอดออก
puchu

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

หมายเหตุ: IE8 และรุ่นเก่ากว่านั้นไม่รองรับการลบ substr ที่เป็นค่าลบ ใช้str.length - 1แทนหากคุณต้องการสนับสนุนเบราว์เซอร์โบราณเหล่านั้น


ชอบการใช้คำว่า 'โบราณ' ที่นี่
PageSource

48

ES6 / ES2015 มี API สำหรับถามว่าสตริงลงท้ายด้วยบางสิ่งซึ่งช่วยให้การเขียนฟังก์ชั่นที่สะอาดและอ่านง่ายขึ้น

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

3
ทางออกที่ดีที่สุดในปี 2562
พอลราด

@PaulRad ในขณะที่ใช้ soln นี้รับปัญหาของ str.slice (0, -1) สาขาไม่ครอบคลุมสำหรับบรรทัดนี้ในการทดสอบหน่วย จะแก้ไขได้อย่างไร?
Bijay Rai

1
@BijayRai ซึ่งหมายความว่าการทดสอบของคุณจะหายไปในกรณีที่strลงท้ายด้วย/เครื่องหมายทับ คุณควรมีการยืนยันสองแบบ (หรือการทดสอบสองครั้ง) แบบหนึ่งมีเครื่องหมายทับและอีกแบบไม่มี
Seth Holladay

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นั้นเป็นสตริง


3
ฉันเห็นด้วยอย่างยิ่งเมื่อใดก็ตามที่คุณเขียน regex มันควรจะห่อในฟังก์ชั่นที่มีชื่อที่อธิบายหรือมีความคิดเห็น
Eric Labashosky

12

ตัวอย่างนี้มีความแม่นยำมากขึ้น:

str.replace(/^(.+?)\/*?$/, "$1");
  1. ไม่ดึง/สตริงเนื่องจากเป็น URL ที่ถูกต้อง
  2. มันแถบสตริงที่มีหลายต่อท้ายทับ

แม้ว่านี่อาจเป็นวิธีที่ถูกต้องในการลบเครื่องหมายทับหลาย ๆ อัน แต่นั่นไม่ใช่คำขอของ OP
Jon L.

@JonL หลายคนเรียกดูสแตกล้นเพื่อค้นหาคำตอบ ฉันคิดว่าคำตอบนี้มีประโยชน์มากกว่าคำตอบที่ยอมรับได้
Ronnel Martinez

@JonL หลายคนเรียกดูสแตกล้นเพื่อค้นหาคำตอบ ฉันคิดว่าคำตอบนี้มีประโยชน์มากกว่าคำตอบที่ยอมรับได้
Ronnel Martinez

11

ฉันรู้ว่าคำถามเกี่ยวกับ slashes ต่อท้าย แต่ฉันพบโพสต์นี้ในระหว่างการค้นหา slash slash (ทั้งที่ส่วนท้ายและส่วนหัวของตัวอักษร) เนื่องจากคนต้องการโซลูชันนี้ฉันโพสต์ที่นี่:

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

อัปเดต :

ดังที่@Stephen Rพูดถึงในความคิดเห็นหากคุณต้องการลบทั้งเครื่องหมายทับและแบ็กสแลชทั้งที่ส่วนท้ายและส่วนหัวของตัวอักษรสตริงคุณจะเขียน:

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

นี่คือคำตอบที่แท้จริง!
สามารถ PERK

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
}

นี่จะตรวจสอบ a / ที่ส่วนท้ายและถ้ามีจะลบออกหากไม่ได้ส่งคืนสตริงเหมือนเดิม

มีเพียงสิ่งเดียวที่ฉันไม่สามารถแสดงความคิดเห็นใน @ThiefMaster ว้าวคุณไม่สนใจเกี่ยวกับความทรงจำของคุณหรือไม่

แก้ไขการศึกษาสำหรับดัชนี zero-based บนสตริง


2

นี่คือตัวอย่าง URL เล็ก ๆ

var currentUrl = location.href;

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

บันทึก url ใหม่

console.log(currentUrl);


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

2
subtring? นอกจากนั้นมันจะลบเครื่องหมายทับแรกและทุกอย่างหลังจากนั้น
ThiefMaster

@ThiefMaster: จริงเหรอ? คุณไม่สามารถบอกได้ว่าฉันหมายถึงsubstringอะไร ใช่แล้วฉันต้องการลบเครื่องหมายทับแรกและทุกอย่างหลังจากนั้นเพราะจะเติมเงินสำหรับคำถามและข้อมูลตัวอย่างที่โพสต์
josh.trow

ความคิดเห็นของเขาบอกว่าเขาต้องการลบเครื่องหมายทับ
ThiefMaster

@ThiefMaster: ซึ่งตามตัวอย่างของเขารหัสของฉันไม่
josh.trow

1
ไม่ใช่เหตุผลที่จะไม่ใช้สิ่งนี้เมื่อ URL เปลี่ยนเป็น "ผ่านการรับรอง" มี http: // สิ่งนี้จะไม่ทำงานและลิงก์ใด ๆ ที่มี / ตรงกลางจะไม่ทำงานให้กับชาว Google
Barkermn01
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.