在javascript中的preg_match

时间:2012-01-22 14:20:00

标签: javascript regex preg-match

我有一个JSON数组:

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

现在,我想创建一个函数:当我输入输入字段“foo”时,必须出现“foo bar”。但如果我输入“bar”,“foo bar”也必须出现。

那么如何检查文本是否包含输入?

(我希望我的问题很清楚)

5 个答案:

答案 0 :(得分:0)

如果您正在寻找专门用于实现此目的的正则表达式: 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");
}

答案 1 :(得分:0)

对于这个简单的任务,你真的不需要正则表达式。以下是如何确定字符串是否包含子字符串:

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

答案 2 :(得分:0)

如果您要查找整个单词匹配,则正则表达式应为\bfoo\b

答案 3 :(得分:0)

如果您想获得“John doe”项目的建议,只要用户输入“J”,那么您最好先查看Trie's (yes, Trie, not Tree!)并实施它(找到一个lib)或者你可以用全字查询解决; 你首先需要用空格分割你的单词并收集每个单词;

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"/>

并将一个事件绑定到它,以便在keydown上搜索匹配的单词

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);
});

'遗憾',它不可能正则表达对象的键(散列/映射)。我建议迭代抛出所有扩展的可能性a,ab,abc,abcd ..,就像上面的代码所示。

当然,与其向用户提醒他可以选择的内容,而不是向他显示下拉列表中的内容,他可以选择是可行的方式。但是我的代码应该指导你如何做到这一点。

答案 4 :(得分:0)

为了更简单的方法,如果这足以满足您的需求,您可以尝试这条路径:

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),该函数将自动填充,如果您希望它从不同的字符串字符开始自动填充(例如通过键入{{ 1}}或fo)您可以通过添加第三个参数

来实现
ba