Разобрать строку по шаблону

Я использую 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 12.08.2018 20:18

@Rafael Пожалуйста, найдите мой обновленный вопрос. Кроме того, моя входная строка также включена в пример кода.

Carol.Kar 12.08.2018 20:23

Действительно, моя ошибка. Действительно интересный вопрос.

Rafael 12.08.2018 21:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
3
59
1

Ответы 1

Как ваш текущий код что-нибудь сгенерирует.

  1. Ваше регулярное выражение не подходит. Он соответствует вложенным элементам в квадратных скобках, а не в скобках. Попробуйте {([^}]*)} для захват все внутри { ... } в $m[1], если нет вложенных скобок.

  2. Читать о 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.

Вот демонстрация на eval.in

(вы также можете использовать анонимная функция, если PHP> = 5.3)

Другие вопросы по теме