2012-11-20 49 views
3

我一直在使用recurisve SpinTax處理器看到here,和它的作品只是罰款較小的字符串。然而,當字符串超過20KB時,它開始用盡內存,這就成了一個問題。PHP Spintax處理器

如果我有這樣的字符串:

{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似乎是這裏的解決方案,但我不知道如何實現它有更高效的性能。

謝謝!

回答

5

你可以創建一個使用中的回調,以確定哪些許多潛力的變種會創建並返回一個函數:

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

非常感謝!正如馬達拉答案的評論所說,這使我從內存錯誤到.0002590秒來處理一個40KB的文件。驚人!謝謝 – David

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); 
+0

我喜歡這個解決方案。運行這個需要花費0.0002592秒,並且舊的方法得到了'允許的內存大小134217728字節耗盡(試圖分配74087字節)'錯誤。優秀! – David

+0

世界誰在低估這個答案? – David

+2

我真的很欣賞這個答案 - 它真的幫了大忙。然而,約翰森桑普森首先得到它。非常感謝! – David