# Работа с условными подмасками в регулярках PHP

Наша задача: данна строка представляющая собой цифры, которые могут быть обрамлены `'!'` либо нет. С помощью регулярного выражения необходимо поймать эти цифры возможно с `'!'`. Для решения задачи удобно использовать карманы. `'!'` - положим в карман и скажем, что он может быть, может не быть. Укажем, что может быть любое количество цифр и дальше идет содержимое кармана. Если содержимое найдется, то получим - `'!'`, если не найдется, то будут пустые кавычки. Пример:

`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);`
↑