PHP Conference Nagoya 2025

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.

adicione uma nota

Notas Enviadas por Usuários (em inglês) 2 notes

up
3
mike at clove dot com
14 years ago
When using the (?i:foo) syntax, it appears that the group is not included in the 'matches' argument unless it is nested in an additional set of parenthesis, for example: ((?i:foo))
up
2
mati_ at zenbe dot com
15 years ago
There is also the possibility to enable Modifier only on a specific group, so that the Modifier doesn't stay valid until end or deactivation with "(?-<modifier>)".

The Syntax for that is "?<modifier>:" on the beginning of the group, i.e. (?i:foo) matches on FoO.
To Top