0

代码下方的屏幕截图显示了我的问题。它只对文本的一个实例进行彩虹处理。

如何获得此代码来执行每个 [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标签被贬低;您应该在属性中使用spanwith 。color:#XXXXXXstyle

于 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可以将起点作为第二个参数,因此在开始下一次迭代时lastChar+10应该可以工作。

除此之外,使用 regex 和 完全做到这一点可能更容易.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 回答