我正在尝试开发一个可以对字符串进行排序的函数:
Donny went to the {park|store|{beach with friends|beach alone}} so he could get a breath of fresh air.
我打算做的是递归搜索{}模式的文本,其中{}内没有{或},所以只选择最里面的夹心文本,然后我将运行一个php来对内容进行排列并随机选择一个,重复进程直到整个字符串被解析,显示一个完整的句子。
我只是无法绕过正则表达式。
感谢任何帮助!
答案 0 :(得分:2)
不知道这背后的数学理论; - /但在实践中这很容易。尝试
$text = "Donny went to the {park|store|{beach with friends|beach alone}} so he could get a breath of fresh air. ";
function rnd($matches) {
$words = explode('|', $matches[1]);
return $words[rand() % count($words)];
}
do {
$text = preg_replace_callback('~{([^{}]+)}~', 'rnd', $text, -1, $count);
} while($count > 0);
echo $text;
答案 1 :(得分:1)
答案 2 :(得分:1)
$str="Donny went to the {park|store|{beach {with friends}|beach alone}} so he could get a breath of fresh air. ";
$s = explode("}",$str);
foreach($s as $v){
if(strpos($v,"{")!==FALSE){
$t=explode("{",$v);
print end($t)."\n";
}
}
输出
$ php test.php
with friends
答案 3 :(得分:0)
您可以使用词法分析器/解析器执行此操作。我不知道PHP中的任何选项(但由于PHP中有XML解析器,所以毫无疑问是通用解析器)。另一方面,你要做的事情并不是太复杂。在PHP(子字符串等)中使用字符串,您可以在一些递归函数中执行此操作。
然后,您将最终使用简单的语法在PHP中创建MadLibz生成器。很酷。
答案 4 :(得分:0)
正则表达式不能很好地处理递归的东西,但是PHP会这样做:
$str = 'Donny went to the {park|store|{beach with friends|beach alone}} so he could get a breath of fresh air.';
echo parse_string($str), "\n";
function parse_string($string) {
if ( preg_match('/\{([^{}]+)\}/', $string, $matches) ) {
$inner_elements = explode('|', $matches[1]);
$random_element = $inner_elements[array_rand($inner_elements)];
$string = str_replace($matches[0], $random_element, $string);
$string = parse_string($string);
}
return $string;
}