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.

adicionar nota

Notas de UsuĂĄrios 2 notes

up
3
mike at clove dot com ¶
16 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 ¶
16 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.