У меня есть следующая строка:
$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 собака.
- У мужчины две собаки.
- У человека 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_ *?