preg_match : tout sauf certaines extensions

Petit nouveau ! | 7 Messages

10 nov. 2008, 19:29

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 ?

Mammouth du PHP | 1668 Messages

10 nov. 2008, 20:13

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
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Petit nouveau ! | 7 Messages

10 nov. 2008, 20:33

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.

ViPHP
ViPHP | 5924 Messages

10 nov. 2008, 21:00

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 ]…

Petit nouveau ! | 7 Messages

11 nov. 2008, 00:04

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 ?

Invité
Invité n'ayant pas de compte PHPfrance

11 nov. 2008, 10:19

bonjour,
$reg = '/document\/(.*)\.(?!gif)/';

ViPHP
ViPHP | 5924 Messages

11 nov. 2008, 11:17

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

Invité
Invité n'ayant pas de compte PHPfrance

11 nov. 2008, 11:47

Non, ca ne marcherait pas parfaitement.
peux-tu donner un exemple pour lequel ça ne marche pas ?

Petit nouveau ! | 7 Messages

11 nov. 2008, 12:29

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.

Invité
Invité n'ayant pas de compte PHPfrance

11 nov. 2008, 12:57

peux-tu mettre la ligne exacte de ton .htaccess ?

ViPHP
ViPHP | 5924 Messages

11 nov. 2008, 13:07

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…

ViPHP
ViPHP | 5924 Messages

11 nov. 2008, 13:13

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

Petit nouveau ! | 7 Messages

11 nov. 2008, 13:23

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.

Invité
Invité n'ayant pas de compte PHPfrance

11 nov. 2008, 19:12

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))$/';

ViPHP
ViPHP | 5924 Messages

11 nov. 2008, 21:15

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…