1

これがばかげているように聞こえる場合は申し訳ありませんが、私は JavaScript を初めて使用します。私がやりたいことは次のとおりです。

たとえば、「トレーニング」などのキーワードを含む記事があるとします。記事は次のようになります。

ここにいくつかのテキストがあります。トレーニングとその他のブラブラブラ。これをトレーニングできます...トレーニングを使用すると...

今、私がやりたいのは、「トレーニング」を「実行中」としましょうが、それらすべてを置き換えたくはありません。そのうちの1つ(つまりランダムなもの)を置き換えたいだけです。

JavaScriptを使用してこれを行うにはどうすればよいですか?

4

3 に答える 3

0

100%確信はありませんが、いくつかの小さなテストの後、これは機能するはずです:)

function replaceRandom(str, search, replace) {
    var split = str.split(new RegExp("\b?" + search + "\b?")),
        length = split.length - 1,
        rnd = ~~(Math.random() * length),
        result;

    if (length > 0) {
        result = split.map(function(val, idx) {
            return val && (val + (idx === rnd ? replace : search));
        })

        return result.join("").substring(-search.length);
    } else{
        return str;
    }
}

フィドル

于 2012-09-26T15:04:51.597 に答える
0

メイン文字列内のサブ文字列位置のリストを作成し、単一のランダム置換を実行する関数を作成しました。

function replaceRandom(str, needle, replacement)
{
    var indices = [],
    re = new RegExp(needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'ig');

    // find all string positions where needle occurs
    while (match = re.exec(str)) {
        indices.push(match.index);
    }

    if (indices.length) {
        // determine a random match to do replacement on
        var pos = indices[Math.floor(indices.length * Math.random())];
        return str.substr(0, pos) + replacement + str.substr(pos + needle.length);
    } else {
        return str;
    }
}

それを呼び出すには:

var newStr = replaceRandom('Some text here training and more bla bla bla. We can training this... Using training you can...', 'training', 'running');
// newStr now contains a single replacement
于 2012-09-26T15:04:58.400 に答える
0

この「問題」に対して、140byte.es 未満の小さな関数を作成しました: https://gist.github.com/3728254

HTML

<div id="str">Some text here training and more bla bla bla. We can training this... Using training you can...</div>

JS

var replaceR = function(a,b,c,d,e){e=new RegExp(b,"ig");a.innerHTML=a.innerHTML.replace(d?b:e,c)};

    replaceR(document.getElementById('str'), 'training', 'runing', false);

デモ

アップデート

var string = document.getElementById('str').innerHTML,
    newString = string.replace('training', 'running');

document.getElementById('str').innerHTML = newString;

http://fiddle.jshell.net/db3yc/

更新 2

var s = "Some text here training and more bla bla bla. We can training this... Using training you can...",
    nth = 0,
    r = (new Date().getSeconds()) % 4;
s = s.replace(/training/g, function(match, i, original) {
    nth++;
    return (nth === r) ? "running" : match;
});
document.write(s);

http://fiddle.jshell.net/JfYvA/

于 2012-09-26T14:53:32.443 に答える