8722 sujets

Développement web côté serveur, CMS

Pages :
Bonjour à tous,

je souhaiterais savoir comment trouver un fichier de type .xxxxx.php dans un dossier.

J'ai utilisé la fonction strpos


if((strpos($url_fichier,'.php')) {
//blabla
}


mais ça ne m'affiche que les fichiers en .php hors je voudrais qu'il m'affiche les fichiers commancant par un point .xxxxx.php

Une idée ?

Je pensais à du regex, mais je ne sais pas trop comment m'y prendre.

Merci Smiley smile
Bonjour !

Pour tester la présence d'un 'motif' avec les regex, la fonction preg_match devrait toujours être d'actualité...

Je n'ai pas compris ce que les dièses représentaient dans votre motif : un nombre, des lettres, n'importe quoi...

Si c'est n'importe quoi, le motif à tester doit être quelque chose comme ça :
 #^\.(.+)\.php$#


et ça donne comme condition :
preg_match('#^\.(.+)\.php$#', $url_fichier)


Si ce n'est pas ça... Smiley sweatdrop
la littérature sur les regex est assez abondante sur internet.
Smiley smile
Merci pour la réponse.

j'avais pensé au preg_match, mais ça ne me détecte rien Smiley decu

là j'ai essayé avec :


if (preg_match('/^(.?)*(php\s*$)/',$url_fichier)) {


ça me trouve tous les fichiers en .php, hors je veux afficher seulement les .xxx.php

Il doit y avoir un petit problème quelque part.
Le motif que j'ai utilisé marche chez moi...

j'avoue que je ne comprends pas bien le vôtre.
Smiley smile
Moi non plus ...

Il m'affiche absolument tous les fichiers en .php et ne prend pas en compte exclusivement ceux qui commencent par un .
Modérateur
Bonjour,

Pour ta reconnaissance via un preg_match, je peux te proposer ceci qui peut-être amélioré mais devrait te fournir une base fonctionnelle:
$file=pathinfo($url_fichier, PATHINFO_FILENAME); /* renvoi le fichier sous forme name.extension */

if (preg_match('/(.){1,}\.(.){1,}(\.php)/i', $file)) {
  echo $file,"\n"; /* affiche $file si la correspondance est trouvée */
}

J'ai testé ce pattern via l'outil en ligne PHP Live Regex qui me confirme que ce pattern fonctionne si, et uniquement si, le terme est à rechercher dans le nom de fichier et non via l'url entière.

Explication du Pattern :
/(.){1,}\.(.){1,}(\.php)/i
/ => caractère qui indique le début du pattern (peut-être remplacé par dièse)
(.){1,} => n'importe quel caractère tant qu'il existe en nombre illimité
\. => le point ayant pour signification "n'importe quel caractère' l'anti-slash permet de prendre le point pour ce qu'il est soit, un point
(.){1,} => idem qu'au dessus
(\.php) => les parenthèses pour signifier un bloc. Ici, point+p+h+p, dans cet ordre
/ => indique maintenant que nous sommes à la fin du pattern
i => pour insensitive soit insensible à la casse

Alors pourquoi ne pas matcher sur l'url entière du fichier ?
Au vu du pattern, sera prit en considération le point de l'extension du nom de domaine donc preg_match va matcher même les fichiers qui ne sont pas au format que tu souhaite.


En espérant t'avoir aidé, bon courage !


Permalien de mes tests à ce sujet (PhpLiveRegex)
Modifié par Greg_Lumiere (19 May 2016 - 13:24)
Merci Greg_Lumiere pour ces précisions.

Maintenant il me sort bien les .xxx.php mais aussi les .xxx.xxx.php


#1 /Users/xxx/wordpress/.commentpages.php
#2 /Users/xxx/wordpress/wp-content/plugins/exploit-scanner/hashes-3.3.1.php
#3 /Users/xxx/wordpress/wp-content/plugins/exploit-scanner/hashes-3.3.2.php

Il faudrait que j'arrive à filtrer les #2 et #3 tu y est presque Smiley lol
Modérateur
Meaculpa Smiley confused je dois avouer que les regexp ne sont pas mon point fort.

Tes noms de fichiers respectent-il toujours cette syntaxe hashes-3.3.1.php ? (alphanumérique + tiret + chiffre + point etc)


Je fouille de mon côté et le premier qui trouve revient poster la réponse, d'accord ? Smiley biggrin
Modifié par Greg_Lumiere (19 May 2016 - 13:45)
C'est vrai que les regex sont un peu compliqués !

Les noms de fichiers peuvent avoir tout et nimporte quoi Smiley ohwell

allé ça marche, je continue ma recherche Smiley smile
salut,
tu aurais dû préciser ce que représentent les "xxx" ?
Si ce sont des caractères quelconques, il faut juste préciser à la regex que la chaîne doit contenir ce pattern en dernier :

preg_match('`\..+?\.php$`i', $chaine_a_tester);
oui, les xxx correspondent à n’importe quel types de nom de fichiers.

exemple : blabla.php truc.php etc ...

preg_match('`\..+?\.php$`i', $chaine_a_tester);


retourne pareil que ce que m'a proposé Gerg_lumiere, c'est à dire :

#1 /Users/xxx/wordpress/.commentpages.php
#2 /Users/xxx/wordpress/wp-content/plugins/exploit-scanner/hashes-3.3.1.php
#3 /Users/xxx/wordpress/wp-content/plugins/exploit-scanner/hashes-3.3.2.php

il faudrait que ça me trouve seulement le #1 et pas les autres. car le #1 est le seul a commencer avec un point .
Modérateur
As-tu bien utilisé la fonction pathinfo($variable, PATHINFO_FILENAME) ?

Celle-ci a la particularité de ne renvoyer QUE le nom de fichier sans sons extension. In facto cela facilite le pattern car il n'y a plus à regarder ni dans le chemin ni à rechercher après le '.php'.

Si ta requête ne doit concerner que des fichiers php et qu'il est susceptible d'y avoir d'autre type de fichier dans ton dossier, pense à mettre un filtre en amont pour ne récupérer que les fichiers en .php. Là encore la fonction pathinfo() devrait-être ton alliée.
J'ai utilisé ça :


<?php
$rep = "/home/www/mondossier";
$new = new RecursiveDirectoryIterator( $rep );

$i = 0;
foreach (new RecursiveIteratorIterator($new) as $file) {
	
$extension = pathinfo($file->getFilename(),PATHINFO_EXTENSION);
$url_fichier = 	$file->getPath() . "/" . $file->getFilename();

if (preg_match('`\..+?\.php$`i', $url_fichier)) {
echo $file->getPath() . '/' . $file->getFilename() . '<br>';
$i++;
}

}
?>


J'ai utilisé PATHINFO_FILENAME et PATHINFO_EXTENSION mais ça m’affiche exactement pareil.
Modérateur
Dge-06 a écrit :

J'ai utilisé PATHINFO_FILENAME et PATHINFO_EXTENSION mais ça m’affiche exactement pareil.
C'est plutôt incohérent ce que tu me raconte là.

En théorie, la fonction pathinfo() prend les paramètres suivants par rapport à l'exemple htpp://www.mon-domaine.untruc/des-repertoires/un-fichier.bidon.php :
- PATHINFO_BASENAME : retournera un-fichier.bidon.php
- PATHINFO_FILENAME : retournera un-fichier.bidon
- PATHINFO_EXTENSION : retournera .php (à moins qu'il ne retourne que php sans le point, je ne sais plus)
et PATHINFO_DIRNAME...


Bref, si filename et extension renvoient la même chose c'est qu'il y a une cacahuète dans le potage.


Je te propose ce bout de code basé sur celui que tu as fourni précédemment
$rep = '/home/www/mondossier';
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($rep));
$i = 0;

foreach ($files as $file) {
  $extension = pathinfo($file, PATHINFO_EXTENSION);
  $url_fichier = realpath($file);
  
  if (preg_match('`\..+?$`i', pathinfo($file, PATHINFO_FILENAME))) {
  
    echo 'Matching ',$i,': ',$url_fichier,'<br>';
  
    $i++;
  
  }
}

Je l'ai testé sur mon environnement. Au vu du fait que je ne possède pas de fichier qui correspond au pattern, je n'ai aucun retour écran. Si je change mon preg_match en !preg_match (négation), tous mes fichiers ressortent. Ce qui ne confirme pas que le pattern fonctionne mais tout le reste autour, oui.

Et pour toi, qu'en est-il ?


Edit : j'avais laissé !preg_match au lieu de preg_match ; Les cacahuètes c'est bon Smiley rolleyes .
Modifié par Greg_Lumiere (20 May 2016 - 06:18)
Dge-06 a écrit :
il faudrait que ça me trouve seulement le #1 et pas les autres. car le #1 est le seul a commencer avec un point .

Dans ce cas il fallait le préciser dès le départ. Tu as relativement mal expliqué la chose.
Ta condition revient donc à dire que la chaîne doit contenir exactement ".xxxx.php" et la regex dvient :

preg_match('`^\..+?\.php$`i', $chaine_a_tester)
Merci Zelalsan, j'avais peut-être oublié de le préciser alors.

Mais avec la regex que tu m'as donné, plus rien ne s'affiche.
Bonjour,
Dans l'exemple de Zelalsan, $chaine_a_tester doit être pathinfo($file, PATHINFO_BASENAME) pour avoir le nom ET l'extension.

Petite question : tes 'xxxxx' peuvent-ils être des points ? Si non, remplace ".+?" par "[^.]+", plus performant.
Pareil, ça ne m'affiche plus rien.

les xxx peuvent être tout et n’importe quoi. Ça peut être des ? des . des # enfin bref, tout et n’importe quoi.

Je ne m'y connais pas trop en regex, mais je pense qu'il doit bien y avoir un "joker" du genre * ou autre chose.
Dge-06 a écrit :

Je ne m'y connais pas trop en regex, mais je pense qu'il doit bien y avoir un "joker" du genre * ou autre chose.


Le joker est .
Smiley smile
Modérateur
Coucou,

Pour la regExp, j'ai fais ce que j'ai pus mais je dois avouer que je sèche littéralement. Smiley decu

Bon courage !
Pages :