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}.");

09-26 12:53