4

検索基準と一致しないが、同じ文字が含まれている単語を見つけるにはどうすればよいですか?

これがちょっと遊んでみようというフィドルです。

の場合、ユーザーがau最初の2番目のエントリを入力すると表示されます。しかし、ユーザーが入力したときに同じことが起こるようにするにはどうすればよいuaですか?

JS

value以下を使用してからを検索しinput、リストに存在するかどうかを確認します。

$("#search").on("keyup click", function () {
  var value = this.value.toLowerCase();

  $("#list").children().each(function () {
    var text = this.innerText.toLowerCase();
    $(this)[text.indexOf(value) !== 0 ? 'hide' : 'show']();
  });
});

HTML

<input type="search" id="search">

<ul id="list">
    <li><a href="#/australia/">Australia</a></li>
    <li><a href="#/austria/">Austria</a></li>
    <li><a href="#/belgium/">Belgium</a></li>
    <li><a href="#/brazil/">Brazil</a></li>
    <li><a href="#/canada/">Canada</a></li>
    <li><a href="#/denmark/">Denmark</a></li>
    <li><a href="#/finland/">Finland</a></li>
    <li><a href="#/france/">France</a></li>
    <li><a href="#/germany/">Germany</a></li>
    ...and so on...
</ul>

私はあまり詳しくありませんがRegExp、これでうまくいくと思いますか?!

4

3 に答える 3

3

この関数を作成しました。textサブ文字列が含まれている場合はtrueを返しますvalue; 文字がスクランブルされている場合でも**:

function fuzzyContains(text, value) {
    // for value = "THE", build the regex /[the]{3}/ and test
    var valueCopy = value.toLowerCase().replace(/\W/g, "");
    var regexp = new RegExp("[" + valueCopy + "]{" + valueCopy.length + "}");
    return regexp.test(text.toLowerCase());
}
fuzzyContains("Netherlands", "Nethe") // true
fuzzyContains("Netherlands", "Neteh") // true
fuzzyContains("Netherlands", "Nethl") // false

こちらのデモ

アップデート

これが関数の改訂版です。**textからのすべての文字が含まれている場合はtrueを返します。value

function fuzzyContains_v2(text, value) {
    var textCopy = text.toLowerCase();
    var valueCopy = value.toLowerCase().split("");
    console.log(textCopy, valueCopy);
    var a = $.grep(valueCopy, function (value) {
        return textCopy.indexOf(value) == -1;
    });
    return a.length == 0;
}
fuzzyContains("Netherlands", "Nethe")    // true
fuzzyContains("Netherlands", "Neteh")    // true
fuzzyContains("Netherlands", "Nethl")    // true
fuzzyContains("Netherlands", "Netlands") // true

こちらのデモ

value**繰り返し文字が含まれている場合の動作はテストしていません。しかし、私は結果がまだ受け入れられると確信しています。

于 2013-01-13T18:38:00.543 に答える
2

これは RegExp では不可能ですが、次の関数を使用してニーズを満たすことができます。

function looseCharacterMatch(a, b) {
  a = a.split("");
  b = b.substring(0,a.length);
  var c = true;
  for (var i = 0; i < a.length; i++) {
    if (b.replace(a[i], "") == b) {
      c = false;
    }
    b = b.replace(a[i], "");
  }
  return c;
}

デモ| デモソース

于 2013-01-13T17:54:34.297 に答える
0

これを試してください:

var text = this.innerText.toLowerCase();

text = text.replace(/([a-z]*)([A-Z]*)/, '$2$1');
于 2013-01-13T17:23:07.407 に答える