"Похожие темы не найдены" - так молвил форум при введённом поле "Заголовок". :yes3:
Сразу к делу.
Пытаюсь составить регулярное выражение на php.
Изучил литературу, ссылки на которую мне выдал гугл.
Дано:
Строка, в которой может находится ноль или несколько выражений, отделённых от строки символами "{" и "}" соответственно.
После открывающей фигурной скобки идёт символ "@", затем содержимое текстового блока.
Текстовый блок состоит из 4ёх частей, разделённых между собой символом ";":
1. 1-е окончание.
2. 2-е окончание.
3. 3-е окончание.
4. Число-параметр.
Пример строки:
На Вашем счёте {@рубль;рубля;рублей;5}.
Выходящее значение:
На Вашем счёте 5 рублей.
Необходимо, чтобы регулярное выражение находило подобные блоки и выполняла определённую функцию.
Функция и все проверки реализованы. Т.е. если делать без регулярного выражения для каждого блока в отдельности, то всё работает.
Пытался сделать так:
Код:
$str = 'На Вашем счёте {@рубль;рубля;рублей;5}.';
preg_match_all("/[{][@][;a-zA-Zа-яА-Я0-9]+[}]/", $str, $matches);
if(count($matches) == 0)
return false;
...
Функция возвращает false.
Буду очень благодарен за помощь.
P.s.s. В принципе, это первая функция, которая сподвигла меня разобраться в регулярных выражениях.
Данная реализация, в общем, несёт исключительно обучающий характер, ибо я вполне могу использовать подобную структуру:
Код:
<?php
$n = 5;
echo 'На Вашем счёте '.$n.' '.ending('рубль', 'рубля', 'рублей', $n);
?>
Но, согласитесь, реализация через регулярные выражения симпотичнее =)
Добавлено через 1 час 12 минут
Проблему решил сам, всем спасибо =)
Пожалуй, поделюсь кодом =)
Функция:
Код:
public function ending($str = null)
{
if($str == null)
return false;
if(!preg_match_all("/{[@]([a-zA-Zа-яА-Я0-9;]+)}/", $str, $arr))
return false;
$cnt = count($arr);
if($cnt < 2)
return false;
for($i=1;$i<$cnt;$i++)
{
foreach($arr[$i] as $one)
{
$end = explode(';', $one);
if(strlen($end[3]) == 0)
continue;
$num100 = $end[3] % 100;
$num10 = $end[3] % 10;
if($num100 >= 5 && $num100 <= 20)
$replace = $end[2];
else if($num10 == 0)
$replace = $end[2];
else if($num10 == 1)
$replace = $end[0];
else if($num10 >= 2 && $num10 <= 4)
$replace = $end[1];
else if($num10 >= 5 && $num10 <= 9)
$replace = $end[2];
else
$replace = $end[1];
$search = '{@'.$end[0].';'.$end[1].';'.$end[2].';'.$end[3].'}';
$str = str_replace($search, $end[3].' '.$replace, $str);
}
}
return $str;
}
Вызывается таким нехитрым способом:
Код:
$online = 272; //предположим
$txt = "Сейчас в игре {@человек;человека;человек;$online}.";
echo ending($txt);
Результат выполнения функции следующий:
Сейчас в игре 272 человека.
Соль данной функции в том, что она позволяет делать следующее:
Код:
$str = "Всего в игре {@человек;человека;человек;$online}.<br/>";
$str.= "Из них {@орк;орка;орков;$orc} и {@гном;гнома;гномов;$gnome}";
echo ending($txt);