2011-01-17 7 views
20

Estoy tratando de enumerar los archivos en un directorio (recursivo o no) con PHP donde el nombre del archivo coincide con un cierto patrón. Nunca he sido tan bueno con expresiones regulares, así que cualquier ayuda que puedas ofrecer sería genial. Podría buscar un cheque literal de los nombres de los archivos devueltos, pero creo que eso no es tan buena idea :)Buscar todos los archivos en el directorio con cadena o patrón en nombre de archivo con PHP

actualización Solución Final +: 1/18/2011 @ 20:06

Encontré otra manera de hacer lo que estaba buscando una vez que entendí Regex un poco más. Concedido que estaba completamente frustrado acerca de dónde estaba con la expresión regular, ahora obtengo un poco de ella gracias a un amigo que me hace a un lado para explicarme algo de esto en términos más simples de lo que descubrí en las guías en línea.

Esta solución básicamente busca imágenes específicas con un prefijo inicial de "prefixone" o "prefixtwo", al tiempo que verifica que es una imagen de cierto tipo (jpg, jpeg, png) y coincide con cualquier de los siguientes formatos.

Dependiendo de la bala que pasó desde Wordpress (donde estaba usando esto), coincidiría con esa expresión regular. He aquí una lista de ejemplos:

prefixone.123-abc._tag1.001.jpg 
prefixone.345-xyz._tag1.002.jpeg 
prefixtwo.123-abc._tag2._tag1.003.jpg 
prefixone.123-abc._tag2.004.jpeg 
prefixtwo.345-xyz._tag2._tag3._tag1.005.jpg 
prefixtwo.123-abc._tag1.001.jpg 
prefixone.345-xyz._tag1.001.png 
prefixtwo.456-rst._tag1.001.png 

Todos estos archivos que potencialmente pueden haber sido devueltos en el archivo de lista de nuestra función() opendir, cualquiera de ellos podría haber sido un partido si la babosa igualada. Independientemente del orden de la información de etiquetado en el nombre del archivo.

Espero que esto ayude a otro usuario que tenga dificultades con la expresión regular. Es difícil dominarlo pero una vez que comprendes algunas cosas fundamentales, el resto comienza a encajar rápidamente para comenzar a construir el tuyo propio.

Código:

<?php 
// create an array to hold directory list 
$results = array(); 

// create a handler for the directory 
$directory = $_SERVER['DOCUMENT_ROOT'].'/some/path/to/images/'; 
$handler = opendir($directory); 

// open directory and walk through the filenames 
while ($file = readdir($handler)) { 

    // if file isn't this directory or its parent, add it to the results 
    if ($file != "." && $file != "..") { 

     // check with regex that the file format is what we're expecting and not something else 
     if(preg_match('#^(prefixone|prefixtwo)[^\s]*\.'.$wordpress-slug.'\.[^\s]+(\.(jpg|jpeg|png))#', $file)) { 

      // add to our file array for later use 
      $results[] = $file; 
     } 
    } 
} 
?> 

que en realidad no necesita recursiva para esto, pero en realidad hay un montón de ejemplos recursivas en línea y que era verdaderamente el menor de mis preocupaciones. El aislamiento del contenido por patrón era el núcleo de esta tarea, por lo que el código anterior era suficiente.

Nota al margen:

Para los que destacó los "comentarios aceptados" ayer, no tenía ni idea de que me faltaba y me disculpo. Estaba teniendo un mal día. Lo siento si parecía molestar a alguien sobre los comentarios. Esta es una gran comunidad y estoy feliz de poder devolver lo que puedo, también.

+0

He respondido algunas, pero también dice que respondieron 0 de las 6 preguntas elegibles. Ni siquiera veo dónde están esas 6 áreas que espera que conteste. –

+1

Cuando veo algo en lo que creo que puedo contribuir, trato de responder o investigar el problema de la persona. –

+0

Sí, ya lo veo. Lo siento muchachos. –

Respuesta

15

Utilice glob to find pathnames matching a pattern o GlobIterator.

Si necesita que para ser recursivo use a RegexIterator and a RecursiveDirectoryIterator.

Marcado esta CW porque la pregunta es un duplicado segura y se puede fácilmente encontrar ejemplos de todo lo anterior cuando se utiliza la función de búsqueda. Por favor, hazlo.

+3

No estaba buscando "RegexIterator" porque no se me había pasado por la cabeza. No hay necesidad de llamarme para no buscar. Es lo primero que hago antes de tomarme el tiempo para escribir algo. La búsqueda es más rápida. –

+2

Aunque te agradezco que lo hayas señalado. Gran ayuda y gracias :) –

Cuestiones relacionadas