6

私はここに見られるようにrecurisveSpinTaxプロセッサを使用してきました、そしてそれはより小さな文字列のためにうまく働きます。ただし、文字列が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);

しかし、スピンタックスのオプションの間にスペースがあると、バラバラになります。RegExここでの解決策のようですが、それを実装してはるかに効率的なパフォーマンスを実現する方法がわかりませ

ありがとう!

4

2 に答える 2

7

内部でコールバックを使用して、多くのポテンシャルのどのバリアントを作成して返すかを決定する関数を作成できます。

// 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}.");
于 2012-11-20T18:36:48.520 に答える
3

を使用preg_replace_callback()して置換関数を指定できます。

$str = "{Hello|Howdy|Hola} to you, {Mr.|Mrs.|Ms.} {Smith|Williams|Austin}!";

$replacement = function ($matches) {
    $array = explode("|", $matches[1]);
    return $array[array_rand($array)];
};

$str = preg_replace_callback("/\{([^}]+)\}/", $replacement, $str);
var_dump($str);
于 2012-11-20T18:43:01.060 に答える