如here所示,我一直在使用可回收的SpinTax处理器,它对于较小的字符串也可以正常工作。但是,当字符串超过20KB时,它将开始耗尽内存,这已成为一个问题。
如果我有这样的字符串:
{Hello|Howdy|Hola} to you, {Mr.|Mrs.|Ms.} {Smith|Williams|Austin}!
并且我想将单词随机组合在一起,并且而不是使用上面链接中所见的技术(遍历字符串直到大括号中的单词不再出现),我应该怎么做?
我在想这样的事情:
$array = explode(' ', $string);
foreach ($array as $k=>$v) {
if ($v[0] == '{') {
$n_array = explode('|', $v);
$array[$k] = str_replace(array('{', '}'), '', $n_array[array_rand($n_array)]);
}
}
echo implode(' ', $array);
但是,当spintax的选项之间存在空格时,它会崩溃。
RegEx
似乎是这里的解决方案,但是我不知道如何实现它和的性能要高得多。谢谢!
最佳答案
您可以创建一个函数,该函数在其中使用回调来确定将创建和返回许多电位的哪个变体:
// Pass in the string you'd for which you'd like a random output
function random ($str) {
// Returns random values found between { this | and }
return preg_replace_callback("/{(.*?)}/", function ($match) {
// Splits 'foo|bar' strings into an array
$words = explode("|", $match[1]);
// Grabs a random array entry and returns it
return $words[array_rand($words)];
// The input string, which you provide when calling this func
}, $str);
}
random("{Hello|Howdy|Hola} to you, {Mr.|Mrs.|Ms.} {Smith|Williams|Austin}!");
random("{This|That} is so {awesome|crazy|stupid}!");
random("{StackOverflow|StackExchange} solves all of my {problems|issues}.");