微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP Spintax处理器

我一直在使用recurisve SpinTax处理器,如here所示,它适用于较小的字符串.但是,当字符串超过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}.");

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐