Necesito una expresión regular para obtener todos los archivos con la extensión .php, pero que no contienen .html.

Por ejemplo:

foo.php (this file is ok)
foo.html.php (this file is not ok)
foo.bar (this file is not ok)
foo.bar.php (this file is ok)

Creé esta expresión regular:

^(?!.*(.html))

Pero de esta manera también obtengo los archivos que terminan con .bar (y no solo con .php).

3
Mintendo 17 ene. 2018 a las 20:01

3 respuestas

La mejor respuesta

En su propia expresión regular no especificó explícitamente la extensión de archivo .php, por lo que el motor no tiene idea de qué extensiones deben coincidir y cuáles no. Está cerca de hacerlo, y solo un poco si se necesitan modificaciones:

^(?:.(?!\.html))*\.php$

Demo en vivo

2
Peter Mortensen 30 nov. 2019 a las 20:04

Puede asegurarse de que no haya .html en ningún lugar y que termine con .php en la cadena con la que está tratando de hacer coincidir:

^(?!.*\.html).*\.php$

https://regex101.com/r/TOiJQP/4

  • ^(?!.*\.html) Negativa anticipada. Desde el comienzo de la cadena (de ahí el ^), se asegura de que no haya .html en ninguna parte del nombre del archivo
  • .*\.php$ coincide con un nombre de archivo que termina con .php
0
Adrien Brunelat 18 ene. 2018 a las 11:52

Esto coincidirá con el .php que no está precedido por html. He usado la mirada negativa hacia atrás para obtenerlo

.*(?<!\.html)\.php$

Explicación de regex101

(?<!html) Retroceso negativo. Afirma que la expresión regular a continuación no coincide HTML coincide con los caracteres HTML literalmente (distingue entre mayúsculas y minúsculas)

\. coincide con el personaje. literalmente (mayúsculas y minúsculas) php coincide con los caracteres php literalmente (distingue entre mayúsculas y minúsculas)

$ afirma la posición al final de una línea

https://regex101.com/r/TOiJQP/5

0
Robert 18 ene. 2018 a las 15:08
48306356