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?

¿Fue útil?

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.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top