Квантификаторы в PHP
Представьте себе случай, когда нужно отобрать строки, в которых имеется комбинация символов ссс. Первое, что приходит на ум, - это применить шаблон, состоящий из одних литерал (ссс). Однако для решения подобных задач в регулярных выражениях типа POSIX применяют специальные символы, которые называются квантификаторы. Например, в нашем случае шаблон будет выглядеть следующим образом: с{3}. В фигурных скобках можно указывать не только конкретное количество повторений, но и диапазон. Например, шаблон с{2,3} будет соответствовать строкам, где содержатся сочетания символов сс или ссс. Если второй параметр опустить (с{2,}), то строка может содержать два и более символа с, идущих подряд.
На первый взгляд может показаться, что шаблоны с{2}, с{2,3} и с{2,} эквивалентны, так как если строка содержит два или более символа с, идущих подряд, то она будет соответствовать всем этим шаблонам. Однако не стоит спешить с выводами, различие все-таки есть. Рассмотрим листинг 15.6 в качестве примера.
Листинг 15.6. Использование квантификаторов в PHP.
<html>
<head>
<title> Использование квантификаторов </title>
</head>
<body>
<?php
eregi("c{2}" , "qwcccccccqw", $regs);
eregi("c{2,3}" , "qwcccccccqw", $regs);
eregi("c{2,}" , "qwcccccccqw", $regs);
// выведет "cc"
echo "<br>".$regs[0];
// выведет "ссс"
echo "<br>".$regs[1];
// выведет "ccccccc"
echo "<br>".$regs[2];
?>
</body>
</html>
Здесь мы проверяем соответствие шаблонам строки qwcccccccqw и записываем совпавшие комбинации в массив $regs. В результате значения элементов массива оказались сс, ссс и ссссссс. В этом и состоит отличие этих шаблонов.
Помимо фигурных скобок существует еще три квантификатора:
с+ - строка должна содержать один или более символов с , идущих подряд (с{1,});
с* - строка должна содержать ноль или более символов с , идущих подряд (с{0,});
с? - строка должна содержать ноль или один символ с (с{0,1}).