Page 1 sur 1

preg_match : tout sauf certaines extensions

Posté : 10 nov. 2008, 19:29
par praentitong
Salut,

petit souci avec une expression régulière.
Je veux matcher tout sauf le gif admettons.

Je fais donc :

Code : Tout sélectionner

$path = 'document/abcd.gif'; $path2 = 'document/abcd.png'; $path3 = 'document/abcd.jpg'; $path4 = 'document/abcd.goal'; $reg = '/document\/(.*)\.[^[(gif)]]/'; if(preg_match($reg,$path)){echo "ok\n";}else{echo "ko\n";} if(preg_match($reg,$path2)){echo "ok\n";}else{echo "ko\n";} if(preg_match($reg,$path3)){echo "ok\n";}else{echo "ko\n";} if(preg_match($reg,$path4)){echo "ok\n";}else{echo "ko\n";}
Le gif est bien matché, victoire. Mais n'importe quelle autre extension commençant par g également (donc abcd.goal est matché). A croire que les parenthèses ne sont pas prises en compte.

Quelqu'un saurait-il résoudre l'insoluble ?

Posté : 10 nov. 2008, 20:13
par katagoto
Oui :
if(substr($phrase, -4)==".gif") echo "Extension mauvaise";
substr($chaine, -4) récupère les 4 derniers caractères de ta chaine et les retourne, voilà... sans les regex

Posté : 10 nov. 2008, 20:33
par praentitong
merci, mais c'est bien une expression régulière que je veux, de manière à l'intégrer dans un htaccess par la suite.
Par ailleurs j'ai pu contourner le problème d'une autre façon, c'est donc plus par curiosité et par esprit d'apprentissage que je pose cette question.

Pour en revenir à ta proposition, un pathinfo($phrase,PATHINFO_EXTENSION) me semble plus adapté si on utilise php5.

Posté : 10 nov. 2008, 21:00
par Sékiltoyai
Ce n'est pas insoluble, c'est normal. Les crochets désignent une classe de caractère, donc tout caractère de cette classe est matché. Tu n'interdis donc pas *.gif mais "*.([|(|g|i|f|)|])*". En clair, tu interdis toute extension commençant par g, i, f, (, ), [ ou ]…

Posté : 11 nov. 2008, 00:04
par praentitong
ok, merci pour l'explication, ça explique effectivement pourquoi les parenthèses n'ont pas l'effet escompté.
Mais alors comment faire ce que je veux ? Comment dire que c'est la suite g i f dont je ne veux pas ?

Posté : 11 nov. 2008, 10:19
par Invité
bonjour,
$reg = '/document\/(.*)\.(?!gif)/';

Posté : 11 nov. 2008, 11:17
par Sékiltoyai
Non, ca ne marcherait pas parfaitement. Je serais plutôt du genre :
if(
    preg_match(
        '^/document\/([^\\\\\0]*)\.([^\\\\\0]*)$/',
        $string,
        $matches
    ) &&
    !$matches[2] == 'gif'
)
{
    …
}

Posté : 11 nov. 2008, 11:47
par Invité
Non, ca ne marcherait pas parfaitement.
peux-tu donner un exemple pour lequel ça ne marche pas ?

Posté : 11 nov. 2008, 12:29
par praentitong
Non, ca ne marcherait pas parfaitement. Je serais plutôt du genre : PHP:
if(
preg_match(
'^/document\/([^\\\\\0]*)\.([^\\\\\0]*)$/',
$string,
$matches
) &&
!$matches[2] == 'gif'
)
{

}
Comme je l'ai dit plus haut, on ne peut pas appliquer ce genre de solution dans un htaccess.
bonjour,
PHP:
$reg = '/document\/(.*)\.(?!gif)/';
Ca ça marche impec', merci et bravo.
Et donc il semble que si je veux exclure gif et png je fais :
$reg = '/document\/(.*)\.(?!(gif|png))/';
Merci !


Bon en fait, ça marche effectivement très bien avec un preg_match, mais pas dans le htaccess. On dirait que la syntaxe ?! n'est pas reconnue.

Posté : 11 nov. 2008, 12:57
par Invité
peux-tu mettre la ligne exacte de ton .htaccess ?

Posté : 11 nov. 2008, 13:07
par Sékiltoyai
Comme je l'ai dit plus haut, on ne peut pas appliquer ce genre de solution dans un htaccess.
C'est vachement intelligent de poser une question en PHP alors qu'en réalité ton problème vient des .htaccess…
Dans un .htaccess, on matcherait d'abord le gif et ensuite le reste…

Posté : 11 nov. 2008, 13:13
par Sékiltoyai
Non, ca ne marcherait pas parfaitement.
peux-tu donner un exemple pour lequel ça ne marche pas ?
Deux exemples typiques :
- test.php.gif ne devrait pas matcher et matche
- test.gifo devrait matcher et ne matche pas

Posté : 11 nov. 2008, 13:23
par praentitong
Comme je l'ai dit plus haut, on ne peut pas appliquer ce genre de solution dans un htaccess.
C'est vachement intelligent de poser une question en PHP alors qu'en réalité ton problème vient des .htaccess…
Dans un .htaccess, on matcherait d'abord le gif et ensuite le reste…
Merci, j'apprécie toujours énormément qu'on remette en cause mon intelligence, c'est si rare 8-)
J'ai tendance à penser qu'un htaccess étant un fichier de configuration d'Apache, et Apache étant le principal serveur web utilisé par les développeurs PHP, et ces même développeurs étant donc les plus à même de m'aider, je suis pas complètement à côté de la plaque. Je peux me tromper cependant.

Posté : 11 nov. 2008, 19:12
par Invité
Deux exemples typiques :
- test.php.gif ne devrait pas matcher et matche
- test.gifo devrait matcher et ne matche pas
exact !

donc :
$reg = '/document\/.*(?<!\.gif)$/';
ou, pour ne pas accepter les extensions gif et png :
$reg = '/document\/.*(?<!(\.gif|\.png))$/';

Posté : 11 nov. 2008, 21:15
par Sékiltoyai
J'ai tendance à penser qu'un htaccess étant un fichier de configuration d'Apache, et Apache étant le principal serveur web utilisé par les développeurs PHP, et ces même développeurs étant donc les plus à même de m'aider, je suis pas complètement à côté de la plaque. Je peux me tromper cependant.
Attention, je n'ai pas dit que nous n'étions pas à même de t'aider. Beaucoup d'entre nous travaillent sur des fichiers .htaccess. Je dis simplement que ta question est mal posée, on ne pose pas la question en PHP alors qu'en réalité c'est sur la conf apache que se situe le problème.
En l'occurence, on te dit ce qu'il faut faire pour le faire en PHP, si tu veux savoir comment faire la même chose sur apache, alors c'est une toute autre question…