1

JavaScriptで冒とく的なフィルタを作成しようとしています。成功しましたが、悪い言葉をエンコードすると取得できません

仕事に。私はこれに2日間連続で取り組んできました。

変数内のコードをエスケープ解除してから、マッチング時に変数を使用しようとしました。でエスケープを解除しようとしました

マッチコードも。私は document.write と私が考えることができる他のすべてを混ぜてみました。

私の元の機能コード:

var badwords = /fck|psssy|ssshole/i;

Baddata1 = FirstName.value;
Baddata2 = LastName.value;


if (Baddata1.match(badwords))
            {
                checker();
                FirstName.focus();
                return false;
            }
            if (Baddata2.match(badwords))
            {
                checker();
                LastName.focus();
                return false;
            }
function checker() 
        {
            window.alert("Please Remove Bad Words");
        }
4

1 に答える 1

1

文字コードを 0xffff から差し引いてエンコードし、もう一度逆にしてクリア テキストを取得することで、文字列を逆にすることができます。「新しい正規表現」を使用して構築します。

var encstr = "ン゙ロテム゙フヒニテネミヘロ";   // "bad|nasty|word" put through reverse() function
var badwords = new RegExp(reverse(encstr), "i");
var Baddata1 = "bad";
var Baddata2 = "LastName";

function reverse(str) {
    var sout = "", ix;
    if (!str) {
        return "";
    }
    for (ix = 0;  ix < str.length;  ++ix) {
        sout += String.fromCharCode(0xffff - str.charCodeAt(ix));
    }
    return sout;
}


if (Baddata1.match(badwords))
{
    checker();
    FirstName.focus();
    return false;
}
if (Baddata2.match(badwords))
{
    checker();
    LastName.focus();
    return false;
}
function checker()
{
    window.alert("Please Remove Bad Words");
}

ここで jsfiddle を使用します。

高い文字コードを使用したくない場合は、使用しないさまざまなエンコード関数を簡単に置き換えることができますが、これが最もコンパクトです。

編集:逆の文字列を取得するには、JS デバッガーを使用して逆方向を呼び出すか、次のような一時的なコードを追加します。

console.log(reverse("bad|nasty|word"));

これは、reverse(reverse(string1)) === string1 であるため機能します。逆はそれ自体を元に戻します。

別のスクリプトで単語のリストを保持し、リバースに渡された JS 文字列結合を使用してリストを作成することもできます。次に例を示します。

var wordlist = ["bad", "nasty", "word"];
var joined = wordlist.join("|");
console.log('var encstr = "' + reverse(joined) + '"');

デバッグ コンソールから文字列をコピーして貼り付けると、別のスクリプトで文字列が正しいことを簡単に確認できます。

var encstr = "ン゙ロテム゙フヒニテネミヘロ";
alert("encstr " + (reverse(encstr) === joined ? "matches" : "does NOT match") + " original");

編集 2:国際的な範囲に入る高文字コードを使用したくない場合は、base64 などのエンコーディング、またはこの単純なセットを使用してください。

function encodeStr(str) {
    var sout = "", ix;
    if (!str) {
        return "";
    }
    for (ix = 0;  ix < str.length;  ++ix) {
        if (sout.length)
            sout += ",";
        sout += str.charCodeAt(ix).toString(16);
    }
    return sout;
}

function decodeStr(str) {
    var sout = "", narr, ix;
    if (!str) {
        return "";
    }
    narr = str.split(",");
    for (ix = 0;  ix < narr.length;  ++ix) {
        sout += String.fromCharCode(parseInt(narr[ix], 16));
    }
    return sout;
}

// Using encodeStr on "bad|nasty|word" makes this:
var encstr = "62,61,64,7c,6e,61,73,74,79,7c,77,6f,72,64";
var badwords = new RegExp(decodeStr(encstr), "i");
于 2012-11-12T17:35:07.300 に答える