正则表达式帮助 - 括号内的括号

时间:2010-03-15 00:07:30

标签: php regex

我正在尝试开发一个可以对字符串进行排序的函数:

Donny went to the {park|store|{beach with friends|beach alone}} so he could get a breath of fresh air. 

我打算做的是递归搜索{}模式的文本,其中{}内没有{或},所以只选择最里面的夹心文本,然后我将运行一个php来对内容进行排列并随机选择一个,重复进程直到整个字符串被解析,显示一个完整的句子。

我只是无法绕过正则表达式。

感谢任何帮助!

5 个答案:

答案 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)

正则表达式无法计算,因此无法可靠地找到匹配的括号。

您需要的是grammar

请参阅此related question

答案 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;
}