Expresión regular

Iniciado por IWKY, 23 Enero 2010, 22:44 PM

0 Miembros y 2 Visitantes están viendo este tema.

raul338

Ups, perdon, error de copiar y pegar del editor :P

Ahi esta corregida, ahora la explico (y creo que hare un cambio mas :P)

IWKY

Cita de: raul338 en 24 Enero 2010, 19:42 PM
Ups, perdon, error de copiar y pegar del editor :P

Ahi esta corregida, ahora la explico (y creo que hare un cambio mas :P)

Where is it??? Se te ha olvidado poner la expresión, jajjaja
Por internet libre http://red-sostenible.net/
El mejor momento de Dragon Ball Z --> Aqui

raul338

#22
emm....esta modificado en el mensaje anterior :P

^(?![.,])(?:[\w!#$%&\'*+\/=?^_`{|}~\-]+(?:[.,][\w!#$%&\'*+\/=?^_`{|}~\-]+)*|(?>\".+\"))+(?![.,])@(?>\[(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2})\.){3}(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2}))\]|(?![.,])[\w!#$%&\'*+\/=?^_`{|}~\-]+(?:[.,][\w!#$%&\'*+\/=?^_`{|}~\-]+)*(?:\.[a-zA-Z]+))$

IWKY

Bueno...... ahora si te digo que no me valida los correos, que me dices?? jejej
Código (php) [Seleccionar]

$exp = "/^(?![.,])(?:[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*|(?>\".+\"))+(?![.,])@(?>\[(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2})\.){3}(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2}))\]|(?![.,])[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*(?:\.[a-zA-Z]+)(?![.,]))$/";
if(!preg_match($exp, $value)){
       $array_err[2] = $key;
}


Si el correo es correcto, $array_err[2] no debería de contener el valor $key y en cambio si lo contiene, ¿Hay algo mal?
Por internet libre http://red-sostenible.net/
El mejor momento de Dragon Ball Z --> Aqui

raul338

Citar
(?![.,])  -> no debe empezar con . o ,
(?:     -> Grupo: texto entre comillas o texto simple con simbolos
  [\w!#$%&'*+/=?^_`{|}~\-]+                 -> Letras o simbolos
  (?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*     -> ., no pueden estar consecutivos
|
  (?>\".+\")                           -> Texto entre comillas
)+           -> Se pueden repetir varias veces
(?![.,])     -> no puede terminar con . o ,
@          -> simbolo arroba
(?>       -> Grupo: puede ser una IP o texto con simbolos
  \[(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2})\.){3}(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2}))\]
|           ->Texto con simbolos...
  (?![.,])    -> No puede empezar con . o ,
  [\w!#$%&'*+/=?^_`{|}~\-]+      -> letras y simbolos
  (?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*   -> ., no consecutivos
  (?:\.[a-zA-Z]+)  -> Tiene que terminar como dominio (aca es generico, acepta cualquier cosa...)
  (?![.,])   -> Tampoco puede terminar con . o ,
)

Y la explicacion de la expresion regular de IP:


(?: -> Grupo 1:
  (?> -> Aca separamos, el maximo de cada grupo de una IP es 255
    2 -> Si empieza con 2...
    (?>
      5[0-5]  -> y sigue con 5, que pueda hasta 55
    |
      [0-4]?\d)  -> caso contrario, que sea de 0 a 49
  |
    1?  -> o puede ser que sea 100 o menor
    \d{1,2} -> numero...de no mas de 2 cifras
  )
  \.  -> un punto
){3}  -> se debe repetir 3 veces la captura del grupo
(?:  -> Aca se repite exactamente el mismo grupo, pero sin el punto final
  (?> -> Aca separamos, el maximo de cada grupo de una IP es 255
    2 -> Si empieza con 2...
    (?>
      5[0-5]  -> y sigue con 5, que pueda hasta 55
    |
      [0-4]?\d)  -> caso contrario, que sea de 0 a 49
  |
    1?  -> o puede ser que sea 100 o menor
    \d{1,2} -> numero...de no mas de 2 cifras
  )
)


Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.
Cita de: IWKY en 24 Enero 2010, 20:43 PM
Bueno...... ahora si te digo que no me valida los correos, que me dices?? jejej
Código (php) [Seleccionar]

$exp = "/^(?![.,])(?:[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*|(?>\".+\"))+(?![.,])@(?>\[(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2})\.){3}(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2}))\]|(?![.,])[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*(?:\.[a-zA-Z]+)(?![.,]))$/";
if(!preg_match($exp, $value)){
       $array_err[2] = $key;
}


Si el correo es correcto, $array_err[2] no debería de contener el valor $key y en cambio si lo contiene, ¿Hay algo mal?

Es porque estas poniendo mal la expresion, si la pones entre comillas no debes poner los "/" de inicio y cierre :P

o pones
Código (PHP) [Seleccionar]

$exp = "^(?![.,])(?:[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*|(?>\".+\"))+(?![.,])@(?>\[(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2})\.){3}(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2}))\]|(?![.,])[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*(?:\.[a-zA-Z]+)(?![.,]))$";

o sino
Código (PHP) [Seleccionar]

$exp = /^(?![.,])(?:[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*|(?>\".+\"))+(?![.,])@(?>\[(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2})\.){3}(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2}))\]|(?![.,])[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*(?:\.[a-zA-Z]+)(?![.,]))$/;


:P

IWKY

Probe como dices y sigue sin funcionar, y otras expresiones si que me funcionan, pego un trozo más grande del script, y así de paso puedes ver las otras expresiones, por si estuvieran mal, jejej  :xD :xD

Si le quito la / de inicio y fin, no funciona, por ejemplo en la primera que valida nombres, si le quito la /, no funciona y si se la pongo si que funciona bien.

Código (php) [Seleccionar]
foreach($_POST as $key => $value){
switch($key){
case "Nombre":
if(empty($value) or !preg_match("/^[a-zA-Z]+([\s][a-zA-Z]+)*$/", $value)){
$array_err[0] = $key;
}
break;
case "Apellidos":
if(empty($value) or !preg_match("/^[a-zA-Z]+([\s][a-zA-Z]+)*$/", $value)){
$array_err[1] = $key;
}
break;
case "Email":
$exp = "^(?![.,])(?:[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*|(?>\".+\"))+(?![.,])@(?>\[(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2})\.){3}(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2}))\]|(?![.,])[\w!#$%&'*+/=?^_`{|}~\-]+(?:[.,][\w!#$%&'*+/=?^_`{|}~\-]+)*(?:\.[a-zA-Z]+)(?![.,]))$";
if(empty($value) or !preg_match($exp, $value)){
$array_err[2] = $key;
}
break;
case "Password":
case "Password1":
if((empty($_POST['Password']) and empty($_PAST['Password1'])) or ($_POST['Password'] != $_POST['Password1'])){
$array_err[3] = $key;
}
break;
case "Dni":
if(empty($value) or !preg_match("/^[0-9]{8}[A-Z]{1}$/", $value)){
$array_err[4] = $key;
}
$numero = substr($value, 0, -1);
$letras = array("T","R","W","A","G","M","Y","F","P","D","X","B","N","J","Z","S","Q","V","H","L","C","K","E");
$dni = $numero . $letras[$numero%23];
if($dni != $value){
$array_err[4] = $key;
}
break;
case "Pais":
if(empty($value)){
$array_err[5] = $key;
}
break;
case "CodigoPostal":
if(empty($value) or !preg_match("/^[0-9]{5}$/", $value)){
$array_err[6] = $key;
}
break;
case "Direccion":
if(empty($value) or !preg_match("/^[a-zA-Z]+([\s-][a-zA-Z]+)*$/", $value)){
$array_err[7] = $key;
}
break;
case "Ciudad":
if(empty($value) or !preg_match("/^[a-zA-Z]+([\s-][a-zA-Z]+)*$/", $value)){
$array_err[8] = $key;
}
break;
case "Provincia":
if(empty($value) or !preg_match("/^[a-zA-Z]+([\s-][a-zA-Z]+)*$/", $value)){
$array_err[9] = $key;
}
break;
case "Numero":
if(empty($value) or !preg_match("/^[0-9]{1,4}$/", $value)){
$array_err[10] = $key;
}
break;
case "Planta":
if(empty($value) or !preg_match("/^[0-9]{1,3}$/", $value)){
$array_err[11] = $key;
}
break;
case "Puerta":
if(empty($value) or !preg_match("/^[\w]{1,4}$/", $value)){
$array_err[12] = $key;
}
break;
case "Telefono":
if(empty($value) or !preg_match("/^[0-9]{9}$/", $value)){
$array_err[13] = $key;
}
break;
}
}
Por internet libre http://red-sostenible.net/
El mejor momento de Dragon Ball Z --> Aqui

raul338

#26
Este es el codigo generado por el ReggexBuddy con el que edito mis expresiones regulares

Código (PHP) [Seleccionar]

if (preg_match('/^(?![.,])(?:[\w!#$%&\'*+\/=?^_`{|}~\-]+(?:[.,][\w!#$%&\'*+\/=?^_`{|}~\-]+)*|(?>\".+\"))+(?![.,])@(?>\[(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2})\.){3}(?:(?>2(?>5[0-5]|[0-4]?\d)|1?\d{1,2}))\]|(?![.,])[\w!#$%&\'*+\/=?^_`{|}~\-]+(?:[.,][\w!#$%&\'*+\/=?^_`{|}~\-]+)*(?:\.[a-zA-Z]+))$/', $value)) {
# Successful match
} else {
# Match attempt failed
}


Referencia de porque lo hize asi
explicacion detallada de la expresion


Fijate si te funciona, yo ahora no puedo probar :P

IWKY

Funciona perfecto, eres un maestro de las expresiones regulares, por lo que veo has añadido algunas \ para escapar las / y por lo demás esta igual, gracias, he aprendido mucho y me ha gustado debatir este tema contigo.

Un saludo.
Por internet libre http://red-sostenible.net/
El mejor momento de Dragon Ball Z --> Aqui

raul338

jeje...son fascinante las expresiones regulares, y cada dia aprendo mas de ellas :xD

En este tema aprendi que existia el (?!...), que sirve que cancele el analisis si se cumple la condicion que esta dentro (en lugar de seguir avanzando como lo hacen otros :P)

~ Yoya ~

Deberian haber unas cuantas pruebas, asi uno pasa un buen rato xD.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.