12

LIKEJavaScriptで SQL キーワードをエミュレートするにはどうすればよいですか?

何が何だかわからない人のために説明するとLIKE、これはワイルドカードのみをサポートする非常に単純な正規表現であり、%0 個以上の文字に_一致し、正確に 1 文字に一致します。

ただし、次のようなことができるだけではありません。

var match = new RegEx(likeExpr.replace("%", ".*").replace("_", ".")).exec(str) != null;

...パターンには、ドット、星、およびその他の特殊な正規表現文字が含まれている可能性があるためです。

4

10 に答える 10

11

パターン内の正規表現文字を最初にエスケープする限り、あなたが持っているものは機能します。以下は、Simon Willison のブログの一例です。

RegExp.escape = function(text) {
  if (!arguments.callee.sRE) {
    var specials = [
      '/', '.', '*', '+', '?', '|',
      '(', ')', '[', ']', '{', '}', '\\'
    ];
    arguments.callee.sRE = new RegExp(
      '(\\' + specials.join('|\\') + ')', 'g'
    );
  }
  return text.replace(arguments.callee.sRE, '\\$1');
}

次に、コードを次のように実装できます。

likeExpr = RegExp.escape(likeExpr);
var match = new RegEx(likeExpr.replace("%", ".*").replace("_", ".")).exec(str) != null;
于 2009-08-21T20:35:37.233 に答える
2

PHPのpreg_quote関数に基づいて、私が使用する関数は次のとおりです。

function regex_quote(str) {
  return str.replace(new RegExp("([\\.\\\\\\+\\*\\?\\[\\^\\]\\$\\(\\)\\{\\}\\=\\!\\<\\>\\|\\:\\-])", "g"), "\\$1");
}

したがって、あなたの行は次のようになります。

var match = new RegEx(regex_quote(likeExpr).replace("%", ".*").replace("_", ".")).exec(str) != null;
于 2009-08-21T20:51:29.273 に答える
1

正規表現を使用する場合は、文字列の各文字を角かっこで囲むことができます。そうすれば、脱出できるのは数文字だけです。

ただし、長さが検索文字列と一致するようにターゲット文字列を切り捨てて、等しいかどうかを確認することをお勧めします。

于 2009-08-21T20:32:59.140 に答える
0

Chris Van Opstal の回答では、replaceAll の代わりに replaceAll を使用して、出現するすべての「%」と「_」を置き換える必要があります。replaceAll の実行方法への参照 -こちら

于 2014-02-04T05:25:41.713 に答える
0

ジョニーは最近ここに来ましたが、これは私のスパページに使用して、デフォルトページの後に特定のページが結果を表示しないようにします:

function like(haystack,needle){
    needle = needle.split(','); 
    var str = haystack.toLowerCase();
    var n = -1;
    for(var i=0;i<needle.length;i++){
        n = str.search(needle[i]);
        if(n > -1){
            return n;
        }
    }
return n;
}

使用法は - ここでは、ツール、連絡先、またはホームページに結果を表示したくない - results() は、ここには表示しない関数です。

var n = like($data,'tools,contact,home');
//~ alert(n);
if(n < 0){// does not match anything in the above string
  results($data);
}
于 2016-05-14T06:30:47.123 に答える