Наша задача: данна строка представляющая
собой цифры, которые могут быть обрамлены
'!' либо нет. С помощью регулярного
выражения необходимо поймать эти цифры возможно
с '!'. Для решения задачи удобно использовать
карманы. '!' - положим в карман и
скажем, что он может быть, может не быть.
Укажем, что может быть любое количество цифр
и дальше идет содержимое кармана. Если содержимое
найдется, то получим - '!', если не
найдется, то будут пустые кавычки. Пример:
preg_match('#(!?)\d+\1#', '!123!', $match);
var_dump($match);
Как побочный эффект видим содержимое первого
кармана. Если восклицательных знаков не будет,
мы все равно найдем содержимое кармана. Обратите
внимание на то, что нельзя вынести '!'
знак за скобки.
Представим себе ситуацию: мы говорим что у нас могут быть цифры, но обрамленные не какими-то одинаковыми символами а парами(уголками, скобками фигурными...). Задачу с помощью карманов уже не решить. Для решения такой задачи существует специальная команда регулярок, которые называются условными подмазками.
Пример. Ложим первый уголок карман и говорим
- этот карман может быть и может не быть.
Восклицательный знак находится снаружи. Дальше
пишем цифры - любое количество. Дальше записываем
условие - если найдено содержимое первого
кармана, то получим '>', если не найдено,
то условие не сработает:
preg_match('#(<)?\d+(?(1)>)#', '123', $match);
var_dump($match);
Таким образом и работают условия в регулярных выражениях.
Условия существуют двух типов: первое - когда
просто мы проверяем карман на существование
и что-то делаем; второе - представляет собой
и в противном случае. Незабываем указывать
номер кармана. Давайте посмотрим пример,
когда говорим 'если'. Если есть первый
карман то должно стоять то, в противном случае
должен стоять '!':
preg_match('#(<)?\d+(?(1)>|!)#', '<123>', $match);
var_dump($match);