2009-11-19 2 views
231

Можно создать дубликат:
Javascript StartsWithПроверьте, начинается ли строка с чего-то?

Я знаю, что я могу сделать, как^=, чтобы увидеть, если идентификатор начинается с чем-то, и я пытался использовать, что для этого, но это Ждут» т работа ... в принципе, я извлекая URL, и я хочу, чтобы установить класс для элемента для имен путей, которые начинаются в некотором роде ...

Так,

var pathname = window.location.pathname; //gives me /sub/1/train/yonks/459087 

Я хочу, чтобы убедиться, что для каждого пути, который начинается с/суб/1, я могу установить класс для элемента ...

if(pathname ^= '/sub/1') { //this didn't work... 
     ... 
+0

'/^\/sub \/1. * $/Gi.test (pathname)' будет возвращать логическое значение как предикат. –

+1

Если вы приедете сюда через 6 лет (как я), [оригинал и дублированный пост Javascript StartsWith] (http://stackoverflow.com/questions/646628/how-to-check-if-a-string-startswith- еще одна строка) обеспечивает очень аккуратный ответ, используя функцию ecmascript 6 startWith(), которая, кажется, имеет лучшие результаты. – theFreedomBanana

ответ

341

Использование stringObject.substring

if (pathname.substring(0, 6) == "/sub/1") { 
    // ... 
} 
+15

-1: создает дополнительную избыточную строку. – user1071136

+9

Вот пример для этого: http://jsperf.com/starts-with/2. Метод подстроки кажется самым быстрым на моей машине (с V8). – Pijusn

+19

Это можно сделать более общим: 'var x ="/sub/1 "; if (pathname.substring (0, x.length) === x) { // ... }; '. Таким образом, вы больше не зависите от длины 'x', поскольку это может измениться. –

79

Вы можете использовать string.match() и регулярное выражение для этого тоже:

if(pathname.match(/^\/sub\/1/)) { // you need to escape the slashes 

string.match() возвращает массив совпадающих подстрок, если найден, иначе нуль.

+22

+1 для того, чтобы не указывать длину строки поиска – Mercurybullet

+0

Есть ли способ динамически вставить строку url в expr? например ускользнуть от/в URL-адресе? – Tjorriemorrie

+1

@Tjorriemorrie Вы можете использовать класс RegEx для выполнения этого, например var reUrlTester = новый RegEx (your_url_string); if (reUrlTester.test (url)) {// используйте тестовую функцию, чтобы проверить соответствие совпадения. – Cros

34

Побольше повторного использования функции:

beginsWith = function(needle, haystack){ 
    return (haystack.substr(0, needle.length) == needle); 
} 
170
String.prototype.startsWith = function(needle) 
{ 
    return this.indexOf(needle) === 0; 
}; 
+9

-1 см. Здесь комментарии по уважительной причине, чтобы не использовать этот тип реализации: http: // stackoverflow.com/a/1978419/560287 –

+12

+1 indexOf отлично! Я предлагаю не добавлять методы к объектам, которые у вас нет. – collimarco

+1

Это идеальный ответ (вещь indexOf), чем тот, который отмечен как ответ. –

22

Во-первых, позволяет расширить объект строки. Благодаря Ricardo Peres для прототипа, я думаю, что использование переменной «string» работает лучше, чем «игла» в контексте ее более читаемости.

String.prototype.beginsWith = function (string) { 
    return(this.indexOf(string) === 0); 
}; 

Тогда вы используете его вот так. Внимание! Делает код чрезвычайно читаемым.

var pathname = window.location.pathname; 
if (pathname.beginsWith('/sub/1')) { 
    // Do stuff here 
} 
+4

На самом деле ничего не добавляю. – ratbum

+0

IMHO ** indexOf ** ищет всю строку, если не находит немедленного совпадения в начале: поэтому ее неэффективность растет для очень длинных строк для поиска. –

Смежные вопросы