> suppose there's a string > $string="I like my(hot) coffee with sugar and (milk)(PHP)"; > > I would like to get an output of all possible combinations of the sentence > with the words between brackets: > eg. > I like my hot coffee with sugar and > I like my hot coffee with sugar and milk > I like my hot coffee with sugar and milk php > I like my coffee with sugar and > I like my coffee with sugar and milk php > etc.etc. > > The number of the words between brackets can differ and they can occur > everywhere. The most important is that all combinations are returned but > the > sentence (not between brackets) should be there.
Here's a solution. :) Hope it helps. You could adapt it to not use the placeholders if each word in parenthesis is unique. <? $text = "I like my (hot) coffee with sugar and (milk)(PHP)"; //match words between parenthesis preg_match_all("/\((.*)\)/U",$text,$matches); //replace words with placeholder //<#x#> where 'x' is incremented //for each placeholder $a=0; $text2 = preg_replace("/\((.*)\)/Ue",'sprintf("<#%d#>",$a++)',$text); //determine how many words were matched //and what decimal number equals a binary //number of all ones and a length equal to //the number of matches $num_matches = count($matches[0]); $dec = bindec(str_repeat("1",$num_matches)); //Original text echo $text . "<hr>"; for($x=0;$x<=$dec;$x++) { $text3 = $text2; $cpy = $x; //loop equal to the number of matched words for($y=0;$y<$num_matches;$y++) { //if least significant bit is one then //replace placeholder with word from $matches //otherwise an empty string $replace = ($cpy & 1) ? $matches[1][$y] : ''; $text3 = str_replace("<#$y#>",$replace,$text3); //shift bits in $cpy one to the right $cpy = $cpy >> 1; } echo $text3 . "<br>"; } ?> ---John W. Holmes... PHP Architect - A monthly magazine for PHP Professionals. Get your copy today. http://www.phparch.com/ -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php