preg_match в JavaScript - PullRequest
       9

preg_match в JavaScript

0 голосов
/ 22 января 2012

У меня есть массив JSON:

[{"name":"foo bar"},{"name":"john doe"}]

Теперь я хочу сделать функцию: когда я набираю в поле ввода «foo», должна появиться «foo bar». Но если я наберу "bar", должно появиться и "foo bar".

Так, как я могу проверить, содержит ли текст ввод?

(надеюсь, мой вопрос достаточно ясен)

Ответы [ 5 ]

0 голосов
/ 22 января 2012

Для упрощения подхода, если этого достаточно для ваших нужд, вы можете попробовать этот путь:

var myArray = [{"name":"foo bar"},{"name":"john doe"}];

function autoFill(input, charCode, minLength)
{
    if (typeof(minLength) == 'undefined') { minLength = 3; }

    var newInsertedValue = input.value + String.fromCharCode(charCode);
    if (newInsertedValue.length >= minLength)
    {
        for (var i=0; i<myArray.length; i++)
        {
            var valueToFill = myArray[i].name.toString();
            if (valueToFill.match(newInsertedValue))
            {
                return valueToFill;
            }
        }
    }

    return newInsertedValue;
}

А затем измените свой тег ввода следующим образом:

<input type="text" onkeypress="this.value=autoFill(this, event.charCode); return false" />

Функция будет автоматически заполняться, когда пользователь наберет не менее 3 символов (например, набрав foo), если вы хотите, чтобы автоматическое заполнение началось с других строковых символов (например, путем ввода fo или ba) вы можете сделать это, добавив третий параметр, например

<input type="text" onkeypress="this.value=autoFill(this, event.charCode, 2); return false" />
0 голосов
/ 22 января 2012

Если вы хотите получить предложения по пункту «Джон Доу», как только Пользователь наберет «J», вам лучше заглянуть в Три (да, Три, а не Дерево!) и реализуйте его (найдите библиотеку), или вы можете рассчитывать на полные запросы;сначала вам нужно разделить слова по пробелам и собрать каждое слово;

var jsonArray=[{"name":"foo bar"},{"name":"john doe"}];
var wordLookup={};
var item,split;
for (var i=0,e=jsonArray.length;i<e;++i){
    item=jsonArray[i];
    split=item.split(" ");
    for (var u=0;u<split.length;++u){
        if (typeof wordLookup[ split[0] ]==="undefined"){
            wordLookup[ split[0] ]=[];
        }
        wordLookup[ split[0] ].push(i);

    }
}

, тогда у вас будет поле ввода

<input type="text" id="suggestion" name="suggestion"/>

, и вы привязаете к нему событие, которое ищетдля подобранного слова при нажатии клавиши

document.getElementById("suggestion").addEventListener("keydown",function(e){
    var list="",val,vs,ve;
    for (vs=0,ve=this.value.length;vs<ve;++vs){
        if (vs===0){val="";}
        val+=this.value.charAt(vs);
        if ( wordLookup[val] ){
            for (var i=0;e=wordLookup[val].length;i<e;++i){
                list+="- "+jsonArray[ wordLookup[val][i] ].name;
            }
        }
    }
    alert("possible matches; "+list);
});

'к сожалению', невозможно переэкспериментировать ключ объекта (hash / map).Я бы предложил перебрасывать все расширенные возможности a, ab, abc, abcd .., как показано в коде выше.

Конечно, вместо того, чтобы предупредить пользователя о том, что он может выбрать, показать ему те из выпадающего списка, которые он может выбрать, это путь.Но мой код должен направить вас в правильном направлении, как это сделать.

0 голосов
/ 22 января 2012

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

var string = 'foo bar';
string.indexOf('foo') != -1 // true
string.indexOf('bar') != -1 // true
string.indexOf('baz') != -1 // false

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

function matches(string, substring) {
   return string.toLowerCase().indexOf(substring.toLowerCase()) != -1
}

matches('Foo Bar', 'BAR'); // true
0 голосов
/ 22 января 2012

Если вы ищете совпадение всего слова, ваше регулярное выражение должно быть \bfoo\b

0 голосов
/ 22 января 2012

Если вы ищете специально для этого регулярные выражения: http://www.w3schools.com/jsref/jsref_obj_regexp.asp

Если любая другая функция подходит:

var str = "Check for substring";
if (str.indexOf("sub") >= 0)
{
    alert("contains");
}
else
{
    alert("Does not contain");
}
...