Foros del Web » Programación para mayores de 30 ;) » RegExp »

Expresión regular con 1 solo guión/guión bajo

Estas en el tema de Expresión regular con 1 solo guión/guión bajo en el foro de RegExp en Foros del Web. Hola amigos, estoy trabajando con el maravilloso framework Symfony y el FOSUserBundle. Para crear un atributo username, he introducido lo siguiente: Código: /** * @Assert\Regex( ...
  #1 (permalink)  
Antiguo 12/10/2016, 04:58
 
Fecha de Ingreso: abril-2013
Mensajes: 75
Antigüedad: 11 años
Puntos: 2
Expresión regular con 1 solo guión/guión bajo

Hola amigos, estoy trabajando con el maravilloso framework Symfony y el FOSUserBundle. Para crear un atributo username, he introducido lo siguiente:

Código:
    /**
     * @Assert\Regex(
     *     pattern="/^[a-z0-9_-]{4,15}$/",
     *     match=true,
     *     message="fos_user.username.regex"
     * )
     * 
     * @var string
     */
    protected $username;
Según el pattern anterior, es válida cualquier cadena, de longitud entre 4 y 15 que contenga letras, números, guiones y guiones bajos.

Quiero personalizar algo más este patrón, limitando el número de guiones/guiones bajos de la siguiente manera:

que solamente se pueda incluir como máximo un guión o un guión bajo (pero no los dos a la vez), y que no sea la primera ni la última posición, es decir:

es válido ---> usuario1
es válido ---> usuario-1
es válido ---> usuario_1

no válido ---> usu-ario_1
no válido ---> -usuario1
no válido ---> _usuario1
no válido ---> usuario1-
no válido ---> usuario1_

Espero alguien pueda ayudarme. Gracias por adelantado.
  #2 (permalink)  
Antiguo 12/10/2016, 11:04
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Expresión regular con 1 solo guión/guión bajo

Hola weltxo,

Tienes un foro dedicado exclusivamente a Symfony:

http://www.forosdelweb.com/f181/

Aparte, no recuerdo ahora donde, pero creo que había otro dedicado a la expresiones regulares... Seguro que ahí recibes mejores respuestas.
  #3 (permalink)  
Antiguo 12/10/2016, 12:17
Avatar de manuparquegiralda  
Fecha de Ingreso: junio-2012
Ubicación: Barcelona
Mensajes: 241
Antigüedad: 11 años, 10 meses
Puntos: 39
Respuesta: Expresión regular con 1 solo guión/guión bajo

Prueba esta expresión regular a ver si te sirve.

Código PHP:
Ver original
  1. ^([A-Za-z\d]-?_?){4,15}[A-Za-z\d]$


Según el patrón que pusiste, solo eran válidos cualquier carácter alfabético que estuviese en minúsculas, no sé si era eso lo que pretendías. En la que te he puesto sirve cualquier carácter alfabético en mayúsculas o minúsculas, si buscas que solo sea en minúsculas quítale la A-Z que hay entre ambos corchetes.

Te la explico para que vayas cogiéndole el truco a esto de las expresiones regulares:

- El carácter ^ nos dice que la cadena tiene que empezar por lo que le prosiga, en este caso sería lo que está dentro del corchete [A-Za-z\d], es decir, tiene que empezar por cualquier letra mayúscula o minúscula o carcater numérico \d

- El paréntesis indica que es un conjunto, es decir, la cadena que venga tiene que cumplir con todo lo que metemos dentro del paréntesis como un conjunto. Si pusiéramos detrás de ese paréntesis otro paréntesis con más opciones la cadena tendría que cumplir con las propiedades de ambos paréntesis en el mismo orden que están estos. Por ejemplo:

Código PHP:
Ver original
  1. ^(([A-Za-z\d]-?_?){4,15})(\s)?([A-Za-z\d]-?_?){4,15}[A-Za-z\d]$

Esta expresión regular solo tomaría una cadena que tuviese dos palabras y cada palabra debería tener las mismas condiciones que las que tu quieres, es decir, podrán tener letras, números y opcionalmente, un guión bajo y un guión. No te haría match con una sola palabra aunque cumpla las condiciones que tu quieres y solo permitiría que hubiera un espacio (\s)? entre cada palabra.

- Dentro del paréntesis pero fuera del corchete tenemos -? y _?. El símbolo ? indica que el caracter que le precedepuede estar o no estar, pero no puede estar más de una vez. En este caso podrá tener un guión bajo o no tenerlo y un guión o no tenerlo.

- Con {4,15} le indicamos que la cadena que cumpla con los parámetros introducidos dentro del paréntesis tiene que tener entre 4 y 15 caracteres.

- Por último con [A-Za-z\d]$ lo que indicamos es que la cadena debe acabar con cualquier letra mayúscula o minúscula o con cualquier número y nunca con un caracter distinto a los que estén dentro del corchete.

No sé si me he explicado bien, pero de todas formas, aquí tienes una página que sirve para probar las expresiones regulares, está bastante bien, échale un vistazo y prueba la que te he pasado para entenderla mejor.

http://www.regexr.com/
__________________
Diseño Web - Arisman Web

Última edición por manuparquegiralda; 12/10/2016 a las 12:50
  #4 (permalink)  
Antiguo 12/10/2016, 12:55
Avatar de manuparquegiralda  
Fecha de Ingreso: junio-2012
Ubicación: Barcelona
Mensajes: 241
Antigüedad: 11 años, 10 meses
Puntos: 39
Respuesta: Expresión regular con 1 solo guión/guión bajo

Perdona te entendí mal, tu querías que tu expresión te permitiese o un guión bajo o un guión normal, pero no ambos a la vez.
__________________
Diseño Web - Arisman Web
  #5 (permalink)  
Antiguo 12/10/2016, 13:59
 
Fecha de Ingreso: abril-2013
Mensajes: 75
Antigüedad: 11 años
Puntos: 2
Respuesta: Expresión regular con 1 solo guión/guión bajo

Cita:
Iniciado por manuparquegiralda Ver Mensaje
Perdona te entendí mal, tu querías que tu expresión te permitiese o un guión bajo o un guión normal, pero no ambos a la vez.
Eso es, que pueda aparecer 1 guión o 1 guión bajo, pero nunca los dos a la vez. Tampoco debe ocupar la primera (0) y última posición (strlen-1). No importa que haya masyúculas/minúsculas.

Etiquetas: php, 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 19:26.