1
votes

regex correspond à tous les fichiers non PDF

preg_match ('/ \. (?! pdf) $ /', $ fichier)

Je veux faire correspondre tous les fichiers sauf les fichiers pdf

path/file.jpg # match
path/file.png # match
path/file.pdf # not match


5 commentaires

si le fichier a un nom comme path / pdf_file.png


correspond à tous les fichiers sauf les fichiers pdf


\. (?! pdf $). + $


@ splash58 Veuillez éviter de poster des réponses sous forme de commentaires; il est plus difficile à trouver et impossible à modifier, à voter, etc.


Vous ne devez pas utiliser toutes les expressions régulières complexes recommandées ci-dessous. Utilisez plutôt $ (? .


3 Réponses :


1
votes

Au lieu d'utiliser regex, vous pouvez prendre l'extension de votre fichier et vérifier s'il s'agit d'un pdf.

<?php
$file = array("path/file.jpg", "path/file.png", "path/file.pdf");
foreach ($file as &$value) {
    preg_match('/^(.(?!.*\.pdf$))*$/', $value, $matches);
    if(!empty($matches)){
        echo " $value is not a pdf";
    }
}

Si vous préférez utiliser regex

$ext = pathinfo($file, PATHINFO_EXTENSION);
if($ext != 'pdf'){
    echo "I'm not a pdf";
}


1 commentaires

Je préfère les regex ..



1
votes

Si vous souhaitez utiliser une expression régulière, celle-ci fonctionnera:

"path/file.jpg" is not a PDF file. 
"path/file.png" is not a PDF file.

Elle utilise simplement une anticipation négative pour affirmer que le nom de fichier ne se termine pas par .pdf code> puis . * pour faire correspondre tout le nom du fichier.

Démo sur regex101

En PHP:

$filenames = array('path/file.jpg','path/file.png','path/file.pdf');
foreach ($filenames as $filename) {
    if (preg_match('/^(?!.*\.pdf).*$/', $filename)) echo "\"$filename\" is not a PDF file.\n";
}

Sortie:

^(?!.*\.pdf).*$
Démo sur 3v4l.org


0 commentaires

0
votes

Affirmer que quelque chose n'est pas présent dans une expression régulière est souvent fastidieux, car une expression régulière fonctionne en regardant à travers l'entrée pour que les choses correspondent.

L'approche que vous avez utilisée est une "assertion à anticipation négative de largeur nulle" - elle correspond à n'importe quel endroit de la chaîne qui n'est pas suivie de pdf , mais pas "utiliser" n'importe quelle entrée . Donc, votre expression régulière ne fonctionne pas car le reste doit encore correspondre, et c'est /\.$/ , qui signifie ". à la fin de la chaîne". < / p>

L'approche la plus simple consiste à rechercher des chaînes qui font fin .pdf , par exemple if (! preg_match ('/ \. pdf $ /', $ fichier)) {...} .


0 commentaires