Foros del Web » Programando para Internet » PHP »

Duda con expresión regular PCRE.

Estas en el tema de Duda con expresión regular PCRE. en el foro de PHP en Foros del Web. Hola buenas, saludos a todos, tengo un problemita con las expresiones regulares PCRE que me esta volviendo loco. Lo que me gustaría saber es si ...
  #1 (permalink)  
Antiguo 06/02/2012, 12:02
 
Fecha de Ingreso: febrero-2012
Mensajes: 10
Antigüedad: 12 años, 2 meses
Puntos: 0
Duda con expresión regular PCRE.

Hola buenas, saludos a todos, tengo un problemita con las expresiones regulares PCRE que me esta volviendo loco.

Lo que me gustaría saber es si lo siguiente se puede hacer y como hacerlo, lo que necesito es validar la primera parte de un correo electrónico (hasta la arroba).
Para ello, dicha parte tiene que comenzar y acabar con letras o dígitos, voy a permitir una serie de símbolos que no pueden ir juntos, es decir quedando en este formato:

letras_números-simbolo-letras_números (sin el separador "-")

Hasta aquí lo consigo, pero tengo el siguiente problema, quiero que ese conjunto de caracteres no exceda los 63 caracteres, esto es lo que no consigo, dejo el patrón que tengo:

Código PHP:
Ver original
  1. /^\w+([\_\-\.\+]?\w+)+$/

Lo que no se es como hacer para que esos caracteres (no el patrón) tenga un máximo de 63 caracteres usando expresiones regulares claro, podría hacerlo con strlen, pero quiero hacerlo con exp.regulares o saber si no se puede hacer.

Un saludo.
  #2 (permalink)  
Antiguo 06/02/2012, 12:13
Avatar de luis010182  
Fecha de Ingreso: julio-2009
Ubicación: Argentina - Capital Federal
Mensajes: 382
Antigüedad: 14 años, 9 meses
Puntos: 27
Respuesta: Duda con expresión regular PCRE.

Documentacion
http://www.php.net/manual/es/referen...ern.syntax.php

http://www.php.net/manual/es/regexp....repetition.php
  #3 (permalink)  
Antiguo 06/02/2012, 12:15
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: Duda con expresión regular PCRE.

Tienes que usar los cuantificadores:

n* Cero o mas de n
n+ Uno o mas de n
n? Uno o ninguno de n
{n} Exactamente n ocurrencias
{n,} Al menos n ocurrencias
{,m} Hasta m ocurrencias
{n,m} Entre n y m ocurrencias (inclusivo)

Visita este aporte, que te ayudará a solucionarlo:

http://www.forosdelweb.com/f18/aport...s-pcre-646110/

Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #4 (permalink)  
Antiguo 06/02/2012, 13:28
 
Fecha de Ingreso: febrero-2012
Mensajes: 10
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Duda con expresión regular PCRE.

Muchas gracias por las respuestas, pero sigo en las mismas, la documentación de php ya me la he mirado varias veces y no consigo sacar en claro lo que quiero hacer, y el otro enlace es muy util pero no resuelve mi duda, si ves el patrón que puse, veras que se usar los cuantificadores, mi problema reside en que no se como usar el cuantificador de forma que consiga este patrón y a la vez lo limite, es decir:

Necesito, letras y dígitos todas las que quiera, a continuación un simbolo elegido de una lista (. - _ +) que no puede repetirse, es decir no puedo tener ++, y a continuación letras, este subpatrón se puede repetir todas las veces que se quiera, pero todo esto no puede superar los 63 caracteres, es decir, puedo tener:

"asss+aaas" pero no "aas++fdfs", ni que dicha cadena, supere los 63 caracteres, eso lo puedo hacer con maximos y mínimos, {1,63} pero no se como conseguir agrupar eso ni donde ponerlo, ya que he probado varias combinaciones pero no me funciona.

Un saludo.
  #5 (permalink)  
Antiguo 06/02/2012, 13:44
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Duda con expresión regular PCRE.

Exacto, simplemente no comprendes.

Los cuantificadores los tiene tu expresión, pero finalmente no resuelven tu problema, para ello debes agrupar de nuevo toda la expresión y luego aplicar el cuantificador.

Cita:
/^(\w+([_\-.+]?\w+)+){1,63}$/
Además, como nota, no necesitas escapar todos los caracteres dentro de [].
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #6 (permalink)  
Antiguo 06/02/2012, 13:50
 
Fecha de Ingreso: febrero-2012
Mensajes: 10
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Duda con expresión regular PCRE.

Gracias pateketrueke, pero si hago eso que dices, simplemente no funciona, mira te paso la expresión completa, en vez de 63, le pongo 5 para comprobar, y ya veras como aunque tenga 100 caracteres lo sigue validando como verdadero.

Código PHP:
Ver original
  1. $test = preg_match('/^(\w+([\_\-\.\+]?\w+)+){1,5}\@{1}(\w+[\.\-]?\w+)+\.{1}[a-z]{2,4}$/','[email protected]',$arrow);

He probado a hacerlo con el patrón antes de la arroba unicamente, tal y como tu me lo has puesto, pero en vez de 63 con 5, y veras que nada, que lo evalua como 1 a pesar de tener mas de 8 caracteres en total:

Código PHP:
Ver original
  1. $test3 = preg_match('/^(\w+([_\-.+]?\w+)+){1,8}$/','df+df3ffffdsfsdfsfsfdf');

Un saludo.
  #7 (permalink)  
Antiguo 06/02/2012, 15:41
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: Duda con expresión regular PCRE.

Es que si no estoy mal, le estás diciendo entre 1 y 63 ocurrencias del subpatron... y lo que necesitas son caracteres. Puedes asignar 1,31 a la primera parte y 1,31 a la segunda parte. Así tendrías un máximo de 62 caracteres. Por ejemplo una idea básica:

Cita:
/^[a-z]{1,31}@{1}[a-z]{1,31}$/
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #8 (permalink)  
Antiguo 06/02/2012, 16:04
 
Fecha de Ingreso: febrero-2012
Mensajes: 10
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Duda con expresión regular PCRE.

Gracias andresdzphp, pero no es eso lo que quiero, es que a lo mejor estoy yo liando la cosa mas de la cuenta, olvidemos todo lo que hay detrás de la arroba, solo me interesa lo que hay antes.

Se que eso es lo que estoy haciendo, lo que dices del patrón, pero ha sido el código que me ha pasado pateketrueke, lo que yo quiero hacer, siempre es, antes de la arroba, y lo que quiero es una cadena de caracteres que no supere los 63 caracteres, dentro de esa cadena necesito que empiece y acabe por letras o números, y entre esas letras o números, pueda llevar un símbolo, ojo, solo uno, cualquiera de una lista

O dicho de otra forma, es decir necesito un patrón en el que haya un símbolo escogido de una lista, [._-+] y que dicho símbolo este rodeado de letras o números, es decir antes y después del símbolo haya una o varias letras (o números,), esto que he dicho lo consigo, de hecho en mi primer mensaje he dejado el patrón, pero lo que no consigo, es que los caracteres de ese patrón no superen los 63 caracteres.

Eso es lo único que necesito.

Si me explico mal, por favor decidmelo, agradezco vuestras respuestas. Un saludo.
  #9 (permalink)  
Antiguo 06/02/2012, 19:35
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: Duda con expresión regular PCRE.

Bueno se me ocurre algo así, no sé si esté dando mucha vuelta pero funciona:

Cita:
/^(?=^\w+[.\-+_]{1}\w+$)[\w.+_\-]{3,63}$/
Negrita es lo capturado:

Cita:
asss+aaas
aas++fdfs
aaaa..aaaa
aaa.aaa
aaaaaaa
20.20
df+df3ffff%dsfsdfsfsfdf@
[email protected]
test_test
test-test
fubar
[email protected]
aaa@aaa
aaaaaa.aaaaaaaa
.aaaaa
a.a
a.aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaa.a
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaa aaaaaaaaaaaaa
(63 caracteres, ignorar espacios que salen por el foro¿?)
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaa aaaaaaaaaaaaaa
(64 caracteres)
aa.aa.aa.aaaaa.aaaa.aaaa.aaaa
PD: No está probada al 100%

Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #10 (permalink)  
Antiguo 07/02/2012, 08:10
 
Fecha de Ingreso: febrero-2012
Mensajes: 10
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Duda con expresión regular PCRE.

Muchísimas gracias andresdzphp, eres mi idolo jaja, es justo lo que necesitaba, solo que con unos ligeros cambios que siguiendo la intuición he podido hacer, para que me acepte el subpatrón varias veces, y me acepte letras sin signos entre medio, por ejemplo:

Cita:
aaa+bbbb+ccc
aaaaa
Patrón modificado:
Código PHP:
Ver original
  1. /^(?=^(\w+[.\-+_]?\w+)+$)[\w.+_\-]{3,63}$/

Solo queda una cosita, a ver si puedes explicarme como funciona lo que me has puesto, que no lo entiendo del todo bien, te digo como mas o menos lo llego a entender yo y me dices si es así o me corriges si no:

Con esta forma:
Código PHP:
Ver original
  1. (?=^\w+[.\-+_]{1}\w+$)

Le dices que busque hacía delante con (?= ) , de forma que encuentre dicho subpatrón, si no lo encuentra devolverá 0, y ahora con esta parte que es la que no entiendo bien:
Código PHP:
Ver original
  1. [\w.+_\-]{3,63}

Con esta ultima parte, le dices que los caracteres contenidos en el subpatrón, en "(?=)" que son letras y dígitos, el punto, el mas, el guión y el guión bajo, sean de 3 a 63, es decir, estas haciendo, una referencia mediante los corchetes, a los caracteres contenidos en el subpatrón anterior, ¿no?

Un saludo y muchísimas gracias por todo.
  #11 (permalink)  
Antiguo 07/02/2012, 09:33
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: Duda con expresión regular PCRE.

Si básicamente es que capture lo de la izquierda si cumple con los caracteres de la derecha y un limite de 3 a 63. El ^ y $ lo coloqué en la izquierda precisamente para que no se repitiera y resulta que si necesitas. Bueno ya lo ajustaste a tus necesidades.

Edit: El problema que veo en tu expresión es que captura por ejemplo:

Código PHP:
Ver original
  1. aas++fdfs
  2. aaaaaaaaaaaaa.aa.....aaaaaaaaaaaa.............aaaaaaaaaaaaaaa

Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP

Última edición por andresdzphp; 07/02/2012 a las 09:53
  #12 (permalink)  
Antiguo 07/02/2012, 09:48
 
Fecha de Ingreso: febrero-2012
Mensajes: 10
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Duda con expresión regular PCRE.

Muchas gracias, solo una ultima cosita mas, cuando inserto la expresión en el patrón total del correo (con la parte de la arroba y lo que le precede), no me funciona, ¿tengo que ponerlo de alguna forma para que lo haga?, dejo toda la expresión:

Código PHP:
Ver original
  1. '/^(?=^(\w+[.\-+_]?\w+)+$)[\w.+_\-]{3,63}\@{1}(\w+[\.\-]?\w+)+\.{1}[a-z]{2,4}$/'

Saludos y gracias por todo de verdad.
  #13 (permalink)  
Antiguo 07/02/2012, 10:14
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: Duda con expresión regular PCRE.

Tiene que ser todo a la izquierda, si lo colocas a la derecha no funciona.

Algo así mas o menos:

Código PHP:
Ver original
  1. /^(?=^(\w+[.\-+_]?\w+)+@{1}(\w+[\.\-]?\w+)+\.{1}[a-z]{2,4}$)[\w.+_\-@]{3,63}$/

No la he probado pero ya sabes donde se coloca todo.

Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #14 (permalink)  
Antiguo 07/02/2012, 10:44
 
Fecha de Ingreso: febrero-2012
Mensajes: 10
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Duda con expresión regular PCRE.

Gracias andresdzphp, pero tu patrón no me funciona, trato de ponerlo a la izquierda tal y como dices, probando con algo mas simple y sigue sin funcionar.

Dejo como anotación, que lo que esta detras de la arroba del patrón que yo dí, funcionaba perfectamente antes de insertar lo que esta antes de ella.

EDITO: He probado lo que dices del error de mi expresión y no es así, no captura los dos ejemplos que pone.
Con esta expresión me devuelve 0, preg_match():
Código PHP:
Ver original
  1. $test2 = preg_match('/^(?=^(\w+[.\-+_]?\w+)+$)[\w.+_\-]{3,63}$/','aaaaaaaaaaaaa.aa.....aaaaaaaaaaaa.............aaaaaaaaaaaaaaa');


Un saludo.

Última edición por shirasep; 07/02/2012 a las 12:12

Etiquetas: regular
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:35.