regulares - regex syntax
.htaccess diferencia de expresión regular/pros/contra (1)
Digamos que tenemos este .htaccess:
RewriteRule ^index/.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?request=$1 [L]
La expresión mencionada en su pregunta tendrá la siguiente lógica:
^ (. *) $
-
.
: unir cualquier personaje y cualquier carácter -
*
: coincide con cero o más del símbolo anterior
Básicamente, coincidirá con algo como:
-
folder1/file1.html
: $ 1 seráfolder1/file1.html
-
file1.html
: $ 1 seráfile1.html
De esta forma, es muy fácil analizar la solicitud completa en PHP o Python. Por otro lado, no filtra ningún carácter no deseado en la URL que deberá validar en su secuencia de comandos.
Ejemplo: =@*-+
([^.] +)
-
[]
: unir cualquiera de los símbolos dentro de los corchetes cuadrados -
[^]
: coincide con cualquier carácter que no sea el que figura dentro de las llaves ( ref ). -
+
: coincide uno o más del símbolo anterior -
[^.]
: coincide con cualquier cosa que no sea.
personaje. Dejará de coincidir cuando a.
personaje se encuentra
De ref .
Los únicos caracteres especiales o metacaracteres dentro de una clase de caracteres son el corchete de cierre (]), la barra invertida (), el símbolo de intercalación (^) y el guión (-). Los metacaracteres habituales son caracteres normales dentro de una clase de caracteres, y no necesitan ser escapados por una barra invertida. Para buscar una estrella o más, use [+ *]. Su expresión regular funcionará bien si escapa de los metacaracteres regulares dentro de una clase de caracteres, pero al hacerlo reduce significativamente la legibilidad.
Básicamente, coincidirá con algo como:
-
folder1/file1.html
: $ 1 seráfolder1/file1
-
file1.html
: $ 1 seráfile1
Esto tiene el mismo efecto que el primero, excepto esto, tira todo después del punto .
^ ([^ /] +) $
-
[]
: unir cualquiera de los símbolos dentro de los corchetes cuadrados -
+
: coincide uno o más del símbolo anterior -
^
: coincide con el comienzo de una cadena -
[^/]
: coincide con cualquier cosa que no sea/
character. Dejará de coincidir cuando se encuentre un/
personaje
Esto tiene el mismo efecto que el primero, excepto que esto controlará cualquier solicitud hasta el /
. Entonces, si tienes varias carpetas, deberás incluir varias veces esta expresión regular.
Básicamente, coincidirá con algo parecido (si solo tienes un juego):
-
folder1/file1.html
: $ 1 willfolder1
-
file1.html
: $ 1 seráfile1.html
y si tienes 2:
-
folder1/file1.html
: $ 1 será lafolder1
y $ 2 coincidirá con elfile1.html
-
file1.html
: $ 1 seráfile1.html
Cuantas más carpetas tenga, más regla tendrá que agregar.
^ ([a-z0-9] +) $ [ ^ ([a-z0-9.] +) $ para este ejemplo]
-
[]
: unir cualquiera de los símbolos dentro de los corchetes cuadrados -
+
: coincide uno o más del símbolo anterior -
az
: letras coincidentes de la aa la z -
0-9
: coincide con los números del 0-9
(También puede usar el / d o / w)
Básicamente, coincidirá con algo parecido (si solo tiene un juego, agregue el punto):
-
folder1/file1.html
: $ 1 willfolder1
-
file1.html
: $ 1 seráfile1.html
y si tienes 2:
-
folder1/file1.html
: $ 1 será lafolder1
y $ 2 coincidirá con elfile1.html
-
file1.html
: $ 1 seráfile1.html
Este funciona como el anterior, excepto que tienes que especificar qué caracteres quieres. Por lo tanto, cuando compruebes tu cadena en PHP, sabes qué caracteres obtienes. Como en mi ejemplo con el nombre del archivo, tuve que agregar el /.
por lo que reconoce el punto. Este también es más rápido de ejecutar.
Ver el benchmark: .htaccess mod_rewrite performance
Por lo tanto, si sabe qué tipo de solicitud obtendrá, siempre puede usar la última, pero si no está seguro, deberá elegir la que mejor se adapte a sus necesidades. Puede haber más diferencia entre todos ellos, pero el objetivo principal de entender estas expresiones regulares es entender lo que hacen o atrapan. Además, el rendimiento es algo que debes tener en cuenta. Hacer coincidir todo y luego analizar la solicitud en PHP o Python puede llevar más tiempo que simplemente combinarlos al principio y simplemente usarlos en el script.
Tengo un montón de reglas en mi .htaccess (subdominios, carpetas, carpetas específicas de usuarios, etc.)
y estoy usando ahora esta expresión regular:
([a-z0-9A-Z])
Estaba buscando una regla específica y encontré varias formas de compilarla y me preguntaba si existe una práctica estándar para esto. ¿cuál es la diferencia / pros / contras de usar algo como:
-
([^.]+)
-
([^/]+)
-
(.*)
-
([a-z0-9]+)