Я использую php 5 для анализа строки. Моя входная строка выглядит следующим образом:
{Billion is|Millions are|Trillion is} {an extremely |a| a generously | a very} { tiny|little |smallish |short |small} stage in a vast {galactic| |large|huge|tense|big |cosmic} {universe|Colosseum|planet|arena}.
Найдите ниже мой минимально жизнеспособный пример:
<?php
function process($text)
{
return preg_replace_callback('/\[(((?>[^\[\]]+)|(?R))*)\]/x', array(
$this,
'replace'
), $text);
}
function replace($text)
{
$text = $this->process($text[1]);
$parts = explode('|', $text);
return $parts[array_rand($parts)];
}
$text = "{Billion is|Millions are|Trillion is} {an extremely |a| a generously | a very} { tiny|little |smallish |short |small} stage in a vast {galactic| |large|huge|tense|big |cosmic} {universe|Colosseum|planet|arena}.";
$res = process($text);
echo $res;
Как видите, я пытаюсь разобрать следующий шаблон, например: {Billion is|Millions are|Trillion is}, используя указанное выше регулярное выражение, /\[(((?>[^\[\]]+)|(?R))*)\]/x.
В результате я получаю ту же строку, что и введенная. Я хотел бы получить в качестве вывода, например:
Billion is a very little stage in a vast huge arena.
Есть предложения, что я делаю неправильно?
@Rafael Пожалуйста, найдите мой обновленный вопрос. Кроме того, моя входная строка также включена в пример кода.
Действительно, моя ошибка. Действительно интересный вопрос.






Как ваш текущий код что-нибудь сгенерирует.
Ваше регулярное выражение не подходит. Он соответствует вложенным элементам в квадратных скобках, а не в скобках. Попробуйте {([^}]*)} для захват все внутри { ... } в $m[1], если нет вложенных скобок.
Читать о preg_replace_callback(). Второй аргумент не может быть массивом.
Рабочий код с некоторыми доработками может выглядеть так:
function process($text) {
return preg_replace_callback('/{([^}]*)}/', 'replace', $text);
}
function replace($m) {
$parts = explode('|', $m[1]);
shuffle($parts);
return $parts[0];
}
$text = "{Billion is|Millions are|Trillion is} {an extremely|a|a generously|a very} {tiny|little|smallish|short|small} stage in a vast {galactic||large|huge|tense|big|cosmic} {universe|Colosseum|planet|arena}.";
echo process($text);
Billion is a generously short stage in a vast Colosseum.
(вы также можете использовать анонимная функция, если PHP> = 5.3)
Пожалуйста, добавьте строку ввода.