php PCRE expresión regular para obtener sólo el nombre de archivo que termina en .txt
-
11-10-2019 - |
Pregunta
por lo que estoy tratando de formar una expresión regular PCRE en php, específicamente para su uso con preg_replace, que coincidirá con cualquier número de caracteres que componen un nombre de archivo de texto (.txt), a partir de esto voy a derivar el directorio del archivo .
mi planteamiento inicial era definir la cadena de terminación .txt, a continuación, intentar especificar un partido de carácter de cada personaje a excepción de la / o \, así que terminé con algo como:
'/[^\\\\/]*\.txt$/'
pero esto no parece funcionar en absoluto, supongo que se podría interpretar como la negación de la forma de De Morgan también conocido como: (A + B) '<=> A'B'
pero después de intentar esta prueba:
'/[^\\\\]\|[^/]*\.txt$/'
Me llegó al mismo resultado, que me hizo pensar que no debería escapar el operador or (|), pero esto también pudo emparejar. Alguien sabe lo que estoy haciendo mal?
Solución
Trate de este patrón '/\b(?P<files>[\w-.]+\.txt)\b/mi'
$PATTERN = '/\b(?P<files>[\w-.]+\.txt)\b/mi';
$subject = 'foo.bar.txt plop foo.bar.txtbaz foo.txt';
preg_match_all($PATTERN, $subject, $matches);
var_dump($matches["files"]);
Otros consejos
La expresión regular foloowing debe trabajar para conseguir el nombre de archivo de los archivos .txt:
$regex = "#.*[\\\\/](.*?\.txt)$#";
¿Cómo funciona?:
-
.*
es codicioso y por lo tanto las fuerzas que coincida ser lo más a la derecha posible. -
[\\\\/]
asegura que tenemos una\
o/
delante del nombre de archivo. -
(.*?\.txt)
utiliza igualación no codicioso para asegurarse de que el nombre de archivo es tan pequeño como sea posible, seguido de.txt
, capturando en el grupo 1. - fuerzas
$
coinciden estar al final de la cadena.