1

我已成功将此 php spintax 代码转换为 javascript,来源来自http://www.edcharkow.com/blog/spintax-easy-php-code/

但有时重复的结果太频繁了,我想用结果检查最后一次纺纱,如果是真的,它应该继续纺。

现在我的问题是,如何在Spin(s)每次执行旋转时从该函数创建一个新实例作为最后一个旋转结果?

我可能会以最直接的方式解决这个问题,但如果有更好的选择,我很想听听。

var text = "{{this|that} is {nice|awesome|great}!|What {are you|am I} doing?|I can't believe {this|that} is {happening|so awesome!}}";

alert( Spin(text) );

function Spin(s)
{
    var m = s.match(/\{(.*?)\}/i);
    if ( !m ) return s;

    var t = m[1];

    if ( t.indexOf("{") !== false )
    {
        t = t.substr(t.lastIndexOf("{") + 1);
    }

    var parts = t.split("|");

    var regex = new RegExp("\{" + preg_quote(t) + "\}");
    s = s.replace( regex, parts[Math.floor(Math.random() * parts.length)] );

    return Spin(s);
}

function preg_quote(str, delimiter) 
{
  return String(str).replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + (delimiter || '') + '-]', 'g'), '\\$&');
}
4

2 回答 2

0

因为我无法设置 2 个变量来比较最后一个旋转文本与函数中的单个构造参数。我求助于放入 2 个参数。虽然感觉很脏,但它确实有效。我仍然会感谢任何愿意提供更好选择的人。

lastSpun = Spin(text, text);

// Spintax
function Spin(s, u)
{
    var m = s.match(/\{(.*?)\}/i);
    if ( !m ) 
    {
        // If spun text is not equal to the last spun text, return the new spun text
        // Else reset the new spun text back into spintax text and spin again
        if ( lastSpun !== s ) { return s; } else { s = u; return Spin(s, u); }
    }

    var t = m[1];

    if ( t.indexOf("{") !== false )
    {
        t = t.substr(t.lastIndexOf("{") + 1);
    }

    var parts = t.split("|");

    var regex = new RegExp("\{" + preg_quote(t) + "\}");
    s = s.replace( regex, parts[Math.floor(Math.random() * parts.length)] );

    // This will loop the spintax until every {nested} elements are chosen
    return Spin(s, u);
}
于 2014-05-02T07:31:28.740 回答
0

保持简单 - Spin 函数应该生成旋转文本,仅此而已。使用其他功能来做你想做的事。

这是一个比较运行的快速包装器:

var prev = "";

var getNewSpun = function(prevSpun) {
     var newspun = Spin(text);   
     while (newspun == prevSpun) {
       newspun = Spin(text);   
     }
     return newspun; 
};


prev = getNewSpun(prev); // this should be different every time
于 2014-05-02T12:50:46.417 回答