Разбор простого текста таким образом, чтобы распознавать пользовательский оператор if

У меня есть следующая строка:

$string = "The man has {NUM_DOGS} dogs."

Я разбираю это, запуская его через следующую функцию:

function parse_text($string)
{
    global $num_dogs;

    $string = str_replace('{NUM_DOGS}', $num_dogs, $string);

    return $string;
}

parse_text($string);

Где $num_dogs— предустановленная переменная. В зависимости от $num_dogsэто может вернуть любую из следующих строк:

  • У человека 1 собака.
  • У мужчины 2 собаки.
  • У человека 500 собак.

Проблема в том, что в случае, когда «у человека 1 собака», собака используется во множественном числе, что нежелательно. Я знаю, что это можно решить, просто не используя функцию parse_text, а вместо этого выполнив что-то вроде:

if($num_dogs = 1){
    $string = "The man has 1 dog.";
}else{
    $string = "The man has $num_dogs dogs.";
}

Но в моем приложении я разбираю не только {NUM_DOGS}, и для записи всех условий потребовалось бы много строк.

Мне нужен сокращенный способ, который я могу записать в начальный $string, который я могу запустить через синтаксический анализатор, который в идеале не ограничивал бы меня только двумя вариантами истинного/ложного.

Например, пусть

$string = 'The man has {NUM_DOGS} [{NUM_DOGS}|0=>"dogs",1=>"dog called fred",2=>"dogs called fred and harry",3=>"dogs called fred, harry and buster"].';

Понятно, что произошло в конце? Я попытался инициировать создание массива, используя часть в квадратных скобках после вертикальной черты, затем сравнил ключ нового массива с проанализированным значением {NUM _DOGS} (, которое к настоящему времени будет переменной $num _dogs слева от вертикальной черты )и вернет значение записи массива с этим ключом.

Если это не совсем запутанно, можно ли использовать функции preg _*?

11
задан dplanet 9 August 2012 в 17:35
поделиться