Справка по регулярным выражениям - скобки в скобках - PullRequest
1 голос
/ 15 марта 2010

Я пытаюсь разработать функцию, которая может сортировать строку, которая выглядит следующим образом:

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

Что я намерен сделать, это рекурсивно искать в тексте {} шаблонов, где естьнет {или} внутри {}, так что выбирается только самый внутренний текст, который будет помещен в сэндвич, где я затем запусту php для массива содержимого и выберу один случайный, повторяя процесс, пока вся строка не будет проанализирована, показываяполное предложение.

Я просто не могу обернуться вокруг регулярных выражений.

Ценю любую помощь!

Ответы [ 5 ]

2 голосов
/ 15 марта 2010

Не знаю о математической теории, стоящей за этим; - / но на практике это довольно просто. Попробуйте

$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 голос
/ 15 марта 2010
$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
1 голос
/ 15 марта 2010

Регулярные выражения не способны считать и, следовательно, не могут найти подходящие скобки.

Вам нужна грамматика .

См. Этот связанный вопрос .

0 голосов
/ 15 марта 2010

Регулярные выражения плохо справляются с рекурсивными вещами, но 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;
}
0 голосов
/ 15 марта 2010

Вы можете сделать это с помощью лексера / парсера. Я не знаю каких-либо опций в PHP (но, поскольку в PHP есть парсеры XML, нет никаких сомнений в универсальных парсерах) С другой стороны, то, что вы просите сделать, не слишком сложно. Используя строки в PHP (подстрока и т. Д.), Вы могли бы сделать это в нескольких рекурсивных функциях.

Затем вы, наконец, создадите генератор MadLibz в PHP с простой грамматикой. Довольно круто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...