จะตรวจสอบว่า URL มีสตริงที่กำหนดได้อย่างไร?


361

ฉันจะทำสิ่งนี้ได้อย่างไร:

<script type="text/javascript">
$(document).ready(function () {
    if(window.location.contains("franky")) // This doesn't work, any suggestions?
    {
         alert("your url contains the name franky");
    }
});
</script>

"window.location.contains is not a function"
ยีน b

คำตอบ:


656

คุณต้องเพิ่มคุณสมบัติ href และตรวจสอบindexOfแทนcontains

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript">
  $(document).ready(function() {
    if (window.location.href.indexOf("franky") > -1) {
      alert("your url contains the name franky");
    }
  });
</script>


3
ฉันมี URL ที่ยาวเช่นนี้preview.tbwabox.co.nz/_v005/index.html#buying-a-carและฉันต้องการตรวจสอบว่าสตริงมี "การซื้อรถยนต์ แต่สคริปต์" ไม่ทำงาน ?
Vennsoh

6
@ Vennsoh คุณไม่สามารถหา "การซื้อรถยนต์" เพราะคุณต้องมองwindow.location.hashไม่window.location.hrefเห็น เพียงสลับค่าเหล่านั้นในฟังก์ชั่นของ OP
Adrian Gonzales

1
@JW ทำไม `> -1 'เราไม่สามารถใช้`> 0` ได้?
Elshan

5
@Elshan เนื่องจากการพูดอย่างเคร่งครัด.href.indexOf("franky") สามารถส่งคืนค่า 0หาก.hrefเริ่มต้นด้วย "franky" แน่นอนในกรณีนี้มันไม่เคย.hrefเริ่มต้นด้วยโพรโทคอลซึ่งมักจะเป็น "http:" หรือ "file:" อย่างไรก็ตามเรื่องนี้คุณควรใช้> -1> = 0 หรือการตั้งค่าของฉัน == - 1 indexOf()เมื่อเทียบกับผลการ
robinCTS

ฉันมีอาร์เรย์ของค่าและต้องการดูว่า Url มีค่าใด ๆ และให้ดัชนีของอาร์เรย์ที่ตรงกับเงื่อนไขหรือไม่ ฉันจะทำอย่างไร ขอบคุณ
Si8

101
if (window.location.href.indexOf("franky") != -1)

จะทำมัน หรือคุณสามารถใช้กับ regexp:

if (/franky/.test(window.location.href))

4
ข้อดี / ข้อเสียระหว่างสองตัวเลือกจะเป็นส่วนเสริมที่ดีสำหรับคำตอบนี้
Chris

แต่ถ้าฉันใช้นิพจน์ regex ไม่มีใครสามารถอ่านได้)
RayLoveless

26

คุณจะใช้indexOfสิ่งนี้:

if(window.location.href.indexOf("franky") != -1){....}

นอกจากนี้สังเกตเห็นการเพิ่มของhrefสตริงมิฉะนั้นคุณจะทำ:

if(window.location.toString().indexOf("franky") != -1){....}

23

ชอบมาก:

    <script type="text/javascript">
        $(document).ready(function () {
            if(window.location.href.indexOf("cart") > -1) 
            {
                 alert("your url contains the name franky");
            }
        });
    </script>

ความแตกต่างระหว่างการเรียก window.location.indexOf และ window.location.href.indexOf คืออะไร
starsplusplus

@starsplusplus ไม่มีความแตกต่าง window.location.hrefเป็นนามแฝงของwindow.location developer.mozilla.org/en-US/docs/Web/API/Window.location
Adrian Gonzales

หนึ่งข้างต้นทำงานได้ดีสำหรับฉัน แต่สำหรับสองตัวแปรวิธีการตรวจสอบมันมีค่าทั้งสอง
Vinoth Narayan

1
@VinothNarayan คุณสามารถเพิ่มเงื่อนไขอื่นในifคำสั่งได้ เพื่อให้แน่ใจว่ามีทั้งสองอย่างคุณสามารถใช้ตัวดำเนินการ AND ซึ่งอยู่&&ใน Javascript: if( window.location.href.indexOf("cart") > -1 && window.location.href.indexOf("box") > -1 ) หากต้องการตรวจสอบว่ามีค่าอย่างใดอย่างหนึ่งให้ใช้ตัวดำเนินการ OR ซึ่งเป็นอักขระไปป์สองตัว|| if( window.location.href.indexOf("cart") > -1 || window.location.href.indexOf("box") > -1 )
Adrian Gonzales

19

window.locationไม่ใช่ String แต่มีtoString()เมธอด ดังนั้นคุณสามารถทำสิ่งนี้ได้:

(''+window.location).includes("franky")

หรือ

window.location.toString().includes("franky")

จากเอกสารเก่า Mozilla :

วัตถุสถานที่มีวิธีการ toString กลับ URL ปัจจุบัน คุณยังสามารถกำหนดสตริงให้กับ window.location ซึ่งหมายความว่าคุณสามารถทำงานกับ window.location ราวกับว่ามันเป็นสตริงในกรณีส่วนใหญ่ บางครั้งตัวอย่างเช่นเมื่อคุณต้องการเรียกใช้เมธอด String คุณต้องโทรไปที่ String


2
ใน Firefox 48, String.prototype.contain () ถูกลบแล้ว ใช้ String.prototype.includes () เท่านั้น ดูที่นี่
CaseyC

@CaseyC เปลี่ยนแล้ว ขอบคุณ!
Alin Purcaru

9

วิธีการ regex:

var matches = !!location.href.match(/franky/); //a boolean value now

หรือในคำสั่งง่ายๆที่คุณสามารถใช้:

if (location.href.match(/franky/)) {

ฉันใช้สิ่งนี้เพื่อทดสอบว่าเว็บไซต์กำลังทำงานอยู่ในเครื่องหรือบนเซิร์ฟเวอร์:

location.href.match(/(192.168|localhost).*:1337/)

การตรวจสอบนี้ไม่ว่าจะเป็นhrefมีอย่างใดอย่างหนึ่ง192.168หรือและตามด้วยlocalhost:1337

อย่างที่คุณเห็นการใช้ regex มีข้อได้เปรียบเหนือโซลูชันอื่น ๆ เมื่อเงื่อนไขมีปัญหาเล็กน้อย


ดี ฉันใช้ if (window.parent.location.href.match (/ \? /)) {window.parent.location = window.parent.location.pathname; } และมันใช้งานได้ดีมาก ...
Tarik

อีกวิธีหนึ่งคือมันกระชับสำหรับฉันที่จะใช้if(/franky/.test(location.href)) { /* regex matched */ }ถ้าฉันไม่ได้ทำอะไรกับการแข่งขัน
cchamberlain

ใช่testสะอาดกว่าmatchในกรณีนี้แน่นอน
เตฟาน Bijzitter


6

ลองสิ่งนี้มันสั้นกว่าและใช้งานได้ดีกับwindow.location.href:

if (document.URL.indexOf("franky") > -1) { ... }

หากคุณต้องการตรวจสอบ URL ก่อนหน้า:

if (document.referrer.indexOf("franky") > -1) { ... }

@sixstarpro ฉันไม่ได้ลงคะแนน แต่โอ้ฉันไม่รู้อาจจะเห็นได้ชัดว่าเพราะคุณให้คำตอบเดียวกับที่โพสต์นี้เมื่อ 18 เดือนก่อน! นอกจากนี้ข้อมูลเพิ่มเติมเกี่ยวกับdocument.referrerคำถามทั้งหมดนั้นไม่เกี่ยวข้องโดยสมบูรณ์
robinCTS

4

ง่ายขึ้นที่จะได้รับ

<script type="text/javascript">
$(document).ready(function () {
    var url = window.location.href;
    if(url.includes('franky'))    //includes() method determines whether a string contains specified string.
    {
         alert("url contains franky");
    }
});
</script>

3

ลองสิ่งนี้:

<script type="text/javascript">             
    $(document).ready
    (
        function () 
        { 
            var regExp = /franky/g;
            var testString = "something.com/frankyssssddsdfjsdflk?franky";//Inyour case it would be window.location;
            if(regExp.test(testString)) // This doesn't work, any suggestions.                 
            {                      
                alert("your url contains the name franky");                 
            }             
        }
    );         
</script> 


2

ใช้ Window.location.href เพื่อใช้ URL เป็นจาวาสคริปต์ มันเป็นคุณสมบัติที่จะบอกตำแหน่ง URL ปัจจุบันของเบราว์เซอร์ การตั้งค่าคุณสมบัติเป็นสิ่งที่แตกต่างกันจะเปลี่ยนเส้นทางหน้า

if (window.location.href.indexOf('franky') > -1) {
     alert("your url contains the name franky");
}

วิธีตรวจสอบว่า url เป็นหน้าเริ่มต้นและไม่สามารถมองเห็นการตรวจสอบ string ของเอี่ยมได้ เช่น example.com/homepage.aspx คือหน้าของฉันและฉันกำลังมองหาสตริง 'หน้าแรก' ถ้า ((loc.toString (). toUpperCase (). indexOf ('หน้าแรก')> -1)) {} ทำงานได้ดี แต่เมื่อ Iam ใน sample.com (ซึ่งยังคงชี้ไปที่ homepage.aspx) โค้ดด้านบนจะไม่ทำงาน จะตรวจสอบสถานการณ์นี้ได้อย่างไรโปรดช่วยด้วย!
Sweta

2

ผมชอบที่จะสร้างแล้วใช้ว่าในเชิงตรรกะbooleanif

//kick unvalidated users to the login page
var onLoginPage = (window.location.href.indexOf("login") > -1);

if (!onLoginPage) {
  console.log('redirected to login page');
  window.location = "/login";
} else {
  console.log('already on the login page');
}

1

ใส่ในไฟล์ js ของคุณ

                var url = window.location.href;
                console.log(url);
                console.log(~url.indexOf("#product-consulation"));
                if (~url.indexOf("#product-consulation")) {
                    console.log('YES');
                    // $('html, body').animate({
                    //     scrollTop: $('#header').offset().top - 80
                    // }, 1000);
                } else {
                    console.log('NOPE');
                }

ฉันไม่รู้~ดังนั้นฉันจึงเงยหน้าขึ้นมอง: " ~เป็นกลอุบายที่จะเปลี่ยนindexOf()ค่าตอบแทนที่ค้นพบให้เป็นความจริง (ในขณะที่ไม่พบว่ามีความผิดพลาด) ผู้อื่นใช้เพื่อผลข้างเคียงของการตัดทอนตัวเลข ... " - stackoverflow.com/a/12299678/3917091
ปกติ Joe

1

การแสดงออกปกติจะเหมาะสมที่สุดสำหรับผู้คนจำนวนมากเนื่องจากขอบเขตของคำ\bหรืออุปกรณ์ที่คล้ายกัน ขอบเขตของคำเกิดขึ้นเมื่อใด ๆ0-9, a-z, A-Z, _ที่อยู่บนฝั่งของการแข่งขันต่อไปหรือเมื่อมีการเชื่อมต่อตัวอักษรและตัวเลขกับสายหรือจุดสิ้นสุดสตริงหรือจุดเริ่มต้น

if (location.href.match(/(?:\b|_)franky(?:\b|_)))

หากคุณใช้if(window.location.href.indexOf("sam")คุณจะได้รับการจับคู่flotsamและsameในคำอื่น ๆ tomจะจับคู่มะเขือเทศและวันพรุ่งนี้โดยไม่ต้อง regex

ทำให้มันเป็นกรณี ๆ iไปเป็นง่ายๆเป็นลบ

เพิ่มเติมการเพิ่มตัวกรองอื่น ๆ เป็นเรื่องง่ายเหมือน

if (location.href.match(/(?:\b|_)(?:franky|bob|billy|john|steve)(?:\b|_)/i))

มาพูดถึง(?:\b|_)กัน RegEx มักจะนิยาม_ว่าเป็นword characterดังนั้นจึงไม่ทำให้เกิดขอบเขตของคำ เราใช้สิ่งนี้(?:\b|_)เพื่อจัดการกับสิ่งนี้ เพื่อดูว่ามันค้นพบ\bหรือ_ทั้งสองด้านของสตริง

ภาษาอื่นอาจจำเป็นต้องใช้สิ่งที่ต้องการ

if (location.href.match(/([^\wxxx]|^)(?:franky|bob|billy|john|steve)([^\wxxx]|$)/i))
//where xxx is a character representation (range or literal) of your language's alphanumeric characters.

ทั้งหมดนี้ง่ายกว่าการพูด

var x = location.href // just used to shorten the code
x.indexOf("-sam-") || x.indexOf("-sam.") || x.indexOf(" sam,") || x.indexOf("/sam")...
// and other comparisons to see if the url ends with it 
// more for other filters like frank and billy

การรองรับ Regular Expressions ของภาษาอื่น\p{L}นั้นไม่รองรับjavascript ซึ่งจะทำให้การตรวจจับตัวอักษรต่างประเทศง่ายขึ้นมาก สิ่งที่ต้องการ[^\p{L}](filters|in|any|alphabet)[^\p{L}]


ข้อเสียเพียงอย่างเดียวของนิพจน์ทั่วไปคือพวกเขา "เขียนเท่านั้น" (เช่นเป็นไปไม่ได้ที่จะอ่าน);)
RayLoveless

@RayLoveless ใช่เลยในภาษาที่ไม่มี(?#comments)และว่าง# commentsเช่น javascript อย่างไรก็ตามสิ่งนี้ไม่ยากที่จะอ่าน // เมื่อฉันใช้ regex ที่ซับซ้อนใน javascript, ฉันเก็บสำเนาความคิดเห็นที่ฉันสามารถแก้ไข lol ได้
ปกติ Joe

0

สมมติว่าคุณมีสคริปต์นี้

<div>
  <p id="response"><p>
  <script>
    var query = document.location.href.substring(document.location.href.indexOf("?") + 1);
    var text_input = query.split("&")[0].split("=")[1];
    document.getElementById('response').innerHTML=text_input;
  </script> </div>

และรูปแบบ URL คือ www.localhost.com/web_form_response.html?text_input=stack&over=flow

ข้อความที่เขียนถึง<p id="response">จะเป็นstack


0

มันจะเป็นการดีถ้าคุณแปลงสตริงของคุณเป็นตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่เนื่องจากเมธอด indexof () จะคำนึงถึงขนาดตัวพิมพ์ นี่จะเป็นถ้าการค้นหาของคุณไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ดังนั้นสำหรับการค้นหาที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่:

var string= location.href;
var convertedString= string.toLowerCase();
 if(convertedString.indexOf(franky) != -1){
  alert("url has franky");
}
else{
 alert("url has no franky");
 }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.