2012-01-22 26 views
0

我有一個JSON陣列:的preg_match在JavaScript

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

現在,我想打一個功能:當我在輸入字段爲「foo」我打字,「富巴」已經出現。但是如果我輸入「bar」,「foo bar」也必須出現。

那麼如何檢查文本是否包含輸入?

(我希望我的問題是不夠清楚)

+1

爲什麼你會用一個普通的「string x is in string y」檢查一個正則表達式? – ThiefMaster

+0

那麼,你想檢查某個字符串是否在另一個字符串中? ['string.indexOf'](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/indexOf) – Zirak

+0

什麼是鏈接!謝謝@MarceloDiniz。 –

回答

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

如果你正在尋找一個完整的詞匹配,你的正則表達式應該是\bfoo\b

0

如果你想獲得項目「John doe」的建議,只要用戶輸入「J」,那麼,你會更好地查看Trie's (yes, Trie, not Tree!)並執行它(找到一個lib)或者你可以d用全字查詢解決; 你首先需要用空白分開你的單詞並收集每個單詞;

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 ..,就像上面演示的代碼一樣。

當然,與其告知用戶他可以選擇什麼,向他展示那些在下拉內的選擇是他可以選擇的方式。但是我的代碼應該指導你如何做到這一點的正確方向。

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)時填充,如果您希望它從不同的字符串字符開始自動填充(例如,輸入foba),則可以通過添加第三個參數如

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