Как проверить, содержит ли 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"
ген б.

Ответы:


657

Вам нужно добавить свойство 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 и я хочу , чтобы проверить , если строка имеет «покупки-а-кар , но сценарий» не работает ?
Веннсо

6
@Vennsoh Вы не можете найти "покупка автомобиля", потому что вам нужно искать window.location.hashне window.location.href. Просто поменяйте эти значения в функции OP.
Эдриан Гонсалес

1
@JW Почему`> -1` нельзя ли использовать`> 0`?
Эльшан

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)

сделал бы это. В качестве альтернативы вы можете использовать регулярное выражение:

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

4
Плюсы / минусы между двумя вариантами было бы хорошим дополнением к этому ответу.
Крис

Но если бы я использовал выражение регулярного выражения, никто бы не смог его прочитать;)
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
Адриан Гонсалес,

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

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не строка, но у нее есть toString()метод. Так что вы можете сделать это так:

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

или

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

Из старых документов Mozilla :

Объекты местоположения имеют метод toString, возвращающий текущий URL. Вы также можете назначить строку для window.location. Это означает, что вы можете работать с window.location, как если бы это была строка в большинстве случаев. Иногда, например, когда вам нужно вызвать метод String для него, вы должны явно вызвать toString.


2
В Firefox 48 String.prototype.contains () был удален. Используйте только String.prototype.include (). Смотрите здесь
CaseyC

@CaseyC изменено. Спасибо!
Алин Пуркару

9

Путь регулярного выражения:

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либо localhostAND, а затем :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в этом случае.
Стефан Бийзиттер

6

document.URLдолжен получить вас URLи

if(document.URL.indexOf("searchtext") != -1) {
    //found
} else {
    //nope
} 

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> 

3

Попробуй indexOf

if (foo.indexOf("franky") >= 0)
{
  ...
}

Вы также можете попробовать поиск (для регулярных выражений)

if (foo.search("franky") >= 0)
{
  ...
}

2

Используйте Window.location.href, чтобы взять URL в JavaScript. это свойство, которое сообщит вам текущее местоположение URL браузера. Установка свойства для чего-то другого перенаправит страницу.

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

Как проверить, является ли URL-адрес страницей по умолчанию, а проверка строкового iam не видна. как, например, sample.com/homepage.aspx - моя страница, и я ищу строку 'homepage'. if ((loc.toString (). toUpperCase (). indexOf ('homepage')> -1)) {} работает нормально, но когда Iam на sample.com (который все еще указывает на homepage.aspx) выше, код не будет работать. Как проверить этот сценарий? Помогите, пожалуйста!
Sweta

2

Мне нравится создавать, booleanа затем использовать это в логической if.

//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
Обычный Джо

1

Регулярные выражения будут более оптимальными для многих людей из-за границ слов \bили подобных устройств. Границы слова возникают , когда какой - либо из 0-9, a-z, A-Z, _находятся на той стороне , на следующий матч, или когда буквенно - цифровой подключается к символьные строки или конец строки или начало.

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

Если вы используете if(window.location.href.indexOf("sam"), вы получите совпадения flotsamи same, среди других слов. tomбудет соответствовать помидору и завтра, без регулярных выражений.

Сделать это с учетом регистра так же просто, как удалить 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

Варианты регулярных выражений в других языках поддерживают, \p{L}а javascript - нет, что значительно упростит задачу обнаружения иностранных символов. Что-то вроде[^\p{L}](filters|in|any|alphabet)[^\p{L}]


Единственным
недостатком

@RayLoveless Да, на языках без (?#comments)и свободно распространяемых # commentsкак javascript. Тем не менее, этот не трудно читать. // Когда я использую сложное регулярное выражение в javascript, я сохраняю закомментированную копию, которую я могу редактировать.
Регулярный Джо

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");
 }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.