我已成功将此php spintax代码转换为javascript,源自http://www.edcharkow.com/blog/spintax-easy-php-code/
但有时重复的结果太频繁了,而且我想用结果检查最后一次旋转的spintax,如果它是真的,它应该继续旋转。
现在我的问题是,每次执行旋转时,如何创建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'), '\\$&');
}
答案 0 :(得分: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);
}
答案 1 :(得分:0)
保持简单 - 旋转功能应生成旋转文本,而不是其他内容。 使用其他功能来做你想做的事。
这是一个比较运行的快速包装器:
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