0

ユーザーが入力したときに、テキスト フィールド内の特定の単語をライブ置換するためのコードを書いています。

私は正規表現と JavaScript を使用しています。最初の配列には検索する正規表現があり、2 番目の配列にはそれらを置き換える単語があります。

source = new Array(/\srsrs\s/,/\sñ\s/,/\snaum\s/,/\svc\s/,/\scd\s/,/\sOq\s/,/\soke\s/,/\so\sq\s/,
                /\soque\s/,/\soqe\s/,/\spq\s/,/\sq\s/,/\sp\/\s/g,/\spra\s/,/\sp\s/,/\stbm\s/,
                /\stb\s/,/\std\s/,/\sblz\s/,/\saki\s/,/\svlw\s/,/\smara\s/,/\sqlq\s/,/\sqq\s/,
                /\srpz\s/,/\smsm\s/,/\smto\s/,/\smtu\s/,/\sqro\s/,/\sqdo\s/,/\sqd\s/,/\sqnd\s/,
                /\sqto\s/,/\sqm\s/,/\sjah\s/, /\sc\/\s/,/\scmg\s/,/\s\+\sou\s\-\s/,/\sflw\s/,
                /\sxau\s/,/\sto\s/,/\sta\s/);
after = new Array("risos","não","não","você","cadê","o que","o que","o que","o que","o que","porque",
            "que","para","para","para","também","também","tudo","beleza","aqui","valeu","maravilhoso",
            "qualquer","qualquer","rapaz","mesmo","muito","muito","quero","quando","quando","quando",
            "quanto","quem","Já","com","comego","mais ou menos","falow","tchau","estou","está");

これは置換を行う関数です:

function replacement(){
for(i=0; i<source.length; i++){
    newtext = " "+document.getElementById("translation").value+" ";
    console.log(newtext);
    if(myregex = newtext.match(source[i])){
    newafter = after[i];
    rafael = myregex+" ";
    document.getElementById("translation").value = document.getElementById("translation").value.replace(rafael, newafter);
    }
}
}

私の問題は、式を1文字だけに置き換えるために関数が呼び出されるたびに、単語内であっても、その文字が最初に出現したときに置換が行われることです。\sその文字を前後で探せば解決すると思ったのですが、そうではありませんでした。

4

4 に答える 4

2

単語の一致だけを探している場合は、\b前後に配置する必要があります (単語境界)。これにより、単語の一部が一致しないことが保証されます。また、文字列を連結して正規表現を破損していることにも注意してください。代わりにこれを試してください:

var in = document.getElementById("translation").value;
if( in.charAt(in.length-1) == " ") { // user has just finished typing a word
                                     // this avoids interrupting the word being typed
    var l = source.length, i;
    for( i=0; i<l; i++) in = in.replace(source[i],after[i]);
    document.getElementById("translation").value = in;
}
于 2012-07-23T11:57:02.823 に答える
1

すべての出現箇所を置き換え、単語の境界をマークする代わりにg使用するように、(グローバル)変更を正規表現に追加する必要があります。\b\s

source = new Array(/\brsrs\b/g,/\bñ\b/g, etc 

余談ですが、すべての正規表現は同じパターンに従うため、次のようにする方が簡単な場合があります。

source = new Array( 'rsr', 'ñ', 'naum', etc );

if( myregex = newtext.match( new Regexp( "\b"+source[i]+"\b", 'g' ) ) ) {
    ...
于 2012-07-23T12:01:14.367 に答える
0

「ライブ置換」によって、キーストロークごとに関数置換を呼び出すことを意味する場合、最後に \b が役に立たない場合は、実際に \s を使用する必要があります。ただし、置換関数では、テキスト フィールドの値にスペースを追加しているため、1 文字の単語が置換をトリガーしています。

これが私のコードのリファクタリングです:

(function () { // wrap in immediate function to hide local variables
  source = [ [/\brsrs\s$/, "risos"], // place reg exp and replacement next to each other
             [/\b(ñ|naum)\s$/, "não"], // note combined regexps
             [/\bvc\s$/, "você"]
             // ...
           ]; // not also use of array literals in place of new Array

  document.getElementById ("translation"​​​​​​​).addEventListener ('keyup', function (ev) {
    var t =  this.value  // fetch text area value
      , m
      , i = source.length;

    while (i--) // for each possible match
      if ((m = t.match(source[i][0]))) { // does this one match ?
        // replace match : first remove the match string (m[0]) from the end of 
        // the text string, then add the replacement word followed by a space
        this.value = t.slice (0, -m[0].length) + source[i][1] + ' '; 
        return; // done
      }
  }, false);  
}) ();​

そして、フィドルは次のとおりです。http://jsfiddle.net/jFYuV

于 2012-07-23T12:53:04.597 に答える
0

少し異なるスタイルで、置換のリストをカプセル化した関数を作成できます。

var substitutions = {
    "rsrs": "risos",
    "ñ": "não",
    "naum": "não",
    "vc": "você",
    // ...
};

var createSubstitutionFunction = function(subs) {
    var keys = [];
    for (var key in subs) {
        if (subs.hasOwnProperty(key)) {
            keys[keys.length] = key;
        }
    }
    var regex = new RegExp("\\b" + keys.join("\\b|\\b") + "\\b", "g");
    return function(text) {
        return text.replace(regex, function(match) {
            return subs[match];
        });
    };
};

var replacer = createSubstitutionFunction(substitutions);

次のように使用します。

replacer("Some text with rsrs and naum and more rsrs and vc")
// ==> "Some text with risos and não and more risos and você"
于 2012-07-23T13:27:42.717 に答える