0

コードの下のスクリーンショットは私に問題を示しています。これは、テキストの1つのインスタンスのみをレインボーファイします。

このコードで[rainbow]指定された[/rainbow]各テキストを実行するにはどうすればよいですか?

実際にはActionScript用ですが、Javascriptでも機能するため、http://jsfiddle.netでテストしています。

var txt = "This is a [rainbow]test to show that I can[/rainbow] make whatever I want [rainbow]appear as a rainbow[/rainbow] because I am [rainbow]awesome[/rainbow].";

if ((txt.indexOf("[rainbow]") > -1) && (txt.indexOf("[/rainbow]") > -1)) {
    var firstChar = txt.indexOf("[rainbow]") + 9;
    var lastChar = txt.indexOf("[/rainbow]");

    var RAINBOWTEXT = '';
    var i = firstChar;

    while (i < lastChar) {
        RAINBOWTEXT += txt.charAt(i);
        i++
    }
    var text = RAINBOWTEXT;
    var texty = '';

    colors = new Array('ff00ff', 'ff00cc', 'ff0099', 'ff0066', 'ff0033', 'ff0000', 'ff3300', 'ff6600', 'ff9900', 'ffcc00', 'ffff00', 'ccff00', '99ff00', '66ff00', '33ff00', '00ff00', '00ff33', '00ff66', '00ff99', '00ffcc', '00ffff', '00ccff', '0099ff', '0066ff', '0033ff', '0000ff', '3300ff', '6600ff', '9900ff', 'cc00ff');
    var i = 0;

    while (i <= text.length) {
        var t = text.charAt(i);

        if (t != undefined) {
            texty += "<font color=\"#" + colors[i % colors.length] + "\">" + t + "</font>";
            i++;
        }
    }

    texty = texty.replace("> <", ">&nbsp;<");
    var REPLACEME = "[rainbow]" + RAINBOWTEXT + "[/rainbow]";
    txt = txt.replace(REPLACEME, texty);
    document.write(txt);
}​

ここに画像の説明を入力してください

4

3 に答える 3

3

タグのインターリーブやネストがないことを想定できる場合は[rainbow]、単純な置換コールバックを使用した正規表現を使用します。

var rainbowified = txt.replace(/\[rainbow\](.*?)\[\/rainbow\]/, function(textWithTags, textBetweenTheseTags) {
    var text = textBetweenTheseTags;
    ....
    for(var i = 0; i < text.length; ++i) {
        // rainbowify each letter of text...
    }
    ...
    return textWithFontTags;
}

これを使用して、必要な変換を含む新しい文字列を取得できます。

また、fontタグは非推奨です。span属性でwithを使用する必要がcolor:#XXXXXXありstyleます。

于 2012-05-24T16:28:47.590 に答える
2
var colors = [
  'f0f', 'f0c', 'f09', 'f06', 'f03', 'f00', 'f30', 'f60', 'f90', 'fc0',
  'ff0', 'cf0', '9f0', '6f0', '3f0', '0f0', '0f3', '0f6', '0f9', '0fc', 
  '0ff', '0cf', '09f', '06f', '03f', '00f', '30f', '60f', '90f', 'c0f'
];
function rainbowify(text) {
  return text.replace(/\[rainbow\](.*)\[\/rainbow\]/g, function(_, inner){
    return inner.replace(/./g, function(ch, i){
      return '<span style="color:#' + colors[i % colors.length] + ';">' + ch + '</span>';
    });
  })
}

これが私がそれをする方法です。

于 2012-05-24T16:47:58.190 に答える
1

ループにします。.indexOfは2番目のパラメーターとして開始点を取ることができるため、次の反復を開始すると機能するlastChar+10はずです。

それとは別に、正規表現と.replace:を使用して完全に実行する方が簡単な場合があります。

return txt.replace(/\[rainbow\](.+?)\[\/rainbow\]/g, function(all, match, index, str) {
    return createRGBrainbowArray(match.length).map(function(color, i) {
        return '<span style="color:#'+color+'">'+match[i]+'</span>';
    }).join("");
});
function createRGBrainbowArray(l) {
    // should return an Array of length l with hexadecimal color strings,
    // representing a nice rainbow
}
于 2012-05-24T16:17:53.167 に答える