Il faudrait donc dans la règle de redirection exclure les url qui commencent par /pingtest/*
Je parle ici d'expressions complète, implicitement accrochées des deux cotés "^expression$"
Par définition, la négation d'un expression rationnelle est rationnelle, et le conjonction de deux expressions est rationnelle, donc on doit pouvoir écrire une telle expression.
Pour commencer, la négation de "a" est facile "[^a]". La négation de "ab" est moins simple; en autorisant l'opérateur &, on peut écrire "ab" = "a.&.b" autrement dit "ab" est un texte qui contient "a suivi d'une lettre" et en même temps "une lettre suivi de b".
~(ab) = ~(a.&.b) = ~(a.) | ~(.b)
~(a.) est l'ensemble des textes qui ne correspondent pas à "a" suivi d'une lettre, donc soit une seule lettre soit deux lettres dont la première n'est pas "a" :
~(a.) = .|((~a).) = .|([^a].)
~(.b) = .|(.(~b)) = .|(.[^b])
donc ~(ab) = .|([^a].)|.|(.[^b]) = .|([^a].)|(.[^b])
c'est à dire un texte d'une lettre ou ne commençant pas par "a" ou ne finissant pas par "b"
Pour une expression contenant "a" : ".*a.*" la négation est facile
~(.*a.*) = (~a)* = [^a]*
Pour une expression ne contenant pas "ab", vous écrivez l'automate non déterministe qui reconnait l'expression ".*ab.*" il a 3 états (s1 : initial, s3 : final), les transitions sont :
s1 : a -> s2 ; . -> s1
s2 : b -> s3 ; . -> s2
s3 : . -> s3
ensuite vous le transformez en automate déterministe S, il a 3 états (S1 : état initial, S3 : état final), les
S1 : a -> S2 ; [^a] -> S1
S2 : b -> S3 ; a -> S2 ; [^ab] -> S1
S3 : . -> S3
On prend la négation c'est à dire l'automate déterministe dont les états finaux sont complèmentaires (S1 : état initial, {S1,S2} : états finaux).
Ex correspond à l'expression de l'état Sx
E1 = |((a+[^ab])*[^a])
E2 = ((a*[^ab])*[^a])a*
on obtient donc |((a+[^ab])*[^a])|((a*[^ab])*[^a])a*
On doit pouvoir faire ça avec 3 lettres, mais je fatigue.