2012-11-20 2 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

감사합니다. Madara의 답변에서 말했듯이 메모리 오류가 발생하여 40KB 파일을 처리하는 데 걸리는 시간이 .0002590 초가되었습니다. 놀랄 만한! 감사합니다 – 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

나는이 솔루션을 좋아합니다. 이를 실행하는 데는 .0002592 초가 걸렸고 이전 방법에는 '허용 된 메모리 크기 인 134217728 바이트가 소모되었습니다 (74087 바이트를 할당하려고했습니다.)'오류가 발생했습니다. 우수한! – David

+0

세계에서 누가이 대답을 줄였습니까? – David

+2

정말이 답변에 감사드립니다. 정말 도움이되었습니다. 그러나 Johnathan Sampson이 먼저 그것에 도달했습니다. 정말 고마워! – David