Configuração de opções dentro da expressão

As configurações de PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, PCRE_UNGREEDY, PCRE_EXTRA, PCRE_EXTENDED e PCRE_DUPNAMES podem ser alteradas de dentro da expressão através de uma sequência de letras de opção do Perl envolvidas entre "(?" e ")". As letras de opções são:

Letras de opções internas
i para PCRE_CASELESS
m para PCRE_MULTILINE
s para PCRE_DOTALL
x para PCRE_EXTENDED
U para PCRE_UNGREEDY
X para PCRE_EXTRA (não mais suportada a partir do PHP 7.3.0)
J para PCRE_INFO_JCHANGED

Por exemplo, (?im) define uma correspondência insensível a maiúsculas/minúsculas, com multi-linhas. Também é possível remover estas opções precendendo a letra com um hífen, e combinar definição com remoção como em (?im-sx), que define PCRE_CASELESS e PCRE_MULTILINE enquanto remove PCRE_DOTALL e PCRE_EXTENDED. Se uma letra aparecer tanto antes quanto depois do hífen, a opção é removida.

Quando uma mudança de opção ocorre no nível mais alto (isto é, não ocorre dentro de parênteses de sub-expressão), a mudança se aplica ao restante da expressão que se segue. Assim, /ab(?i)c/ corresponde apenas a "abc" e "abC".

Se uma mudança de opção ocorre dentro de uma sub-expressão, o efeito é diferente. Isto é uma mudança de comportamento no Perl 5.005. Uma mudança de opção dentro de uma sub-expressão afeta somente aquela parte da sub-expressão que a segue, assim (a(?i)b)c corresponde a "abc" e "aBc" e nenhuma outra string (assumindo que PCRE_CASELESS não seja usada). Por este meio, opções podem ser usadas para ter configurações diferentes em partes diferentes da sub-expressão. Qualquer mudança feita em uma alternativa é carregada nos ramos subsequentes dentro da mesma sub-expressão. Por exemplo, (a(?i)b|c) corresponde a "ab", "aB", "c" e "C", embora quando corresponde a "C", o primeiro ramo é abandonado antes da definição da opção. Isto porque os efeitos de configurações de opções acontecem em tempo de compilação. Haveria comportamento muito estranho caso não fosse desta maneira.

As opções específicas do PCRE PCRE_UNGREEDY e PCRE_EXTRA podem ser alteradas da mesma forma que as compatíveis com o Perl, usando os caracteres U e X respectivamente. A opção (?X) é especial pelo fato de que deve sempre ocorrer na expressão antes de qualquer recurso adicional que ela ativa, mesmo quando está no nível mais alto. É melhor quando colocada no início.