У меня есть следующая строка:
$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 собака», собака используется во множественном числе, что нежелательно. Я знаю, что это можно решить, просто не используя функцию 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 _*?