Expresión regular para letras, números y - _

100

Tengo problemas para verificar en PHP si un valor es cualquiera de las siguientes combinaciones

  • letras (mayúsculas o minúsculas)
  • números (0-9)
  • guion bajo (_)
  • guión (-)
  • punto (.)
  • ¡No hay espacios! u otros personajes

Algunos ejemplos:

  • Aceptar: "screen123.css"
  • Aceptar: "screen-new-file.css"
  • Aceptar: "screen_new.js"
  • NO ACEPTABLE: "filtrar nuevo archivo.css"

Supongo que necesito una expresión regular para esto, ya que necesito lanzar un error cuando una cadena dada tiene otros caracteres además de los mencionados anteriormente.

Jorre
fuente
^ [\ w .-] * $ -> Esto obtendrá el nombre de archivo completo.
Badri Gs

Respuestas:

207

El patrón que desea es algo como ( véalo en rubular.com ):

^[a-zA-Z0-9_.-]*$

Explicación:

  • ^ es el comienzo del ancla de línea
  • $ es el ancla del final de la línea
  • [...] es una definición de clase de carácter
  • * es una repetición "cero o más"

Tenga en cuenta que el guión literal -es el último carácter en la definición de la clase de caracteres; de lo contrario, tiene un significado diferente (es decir, rango). El .también tiene un significado diferentes definiciones de clases de carácter exterior, pero por dentro, es sólo un literal.

Referencias


En PHP

Aquí hay un fragmento para mostrar cómo puede usar este patrón:

<?php

$arr = array(
  'screen123.css',
  'screen-new-file.css',
  'screen_new.js',
  'screen new file.css'
);

foreach ($arr as $s) {
  if (preg_match('/^[\w.-]*$/', $s)) {
    print "$s is a match\n";
  } else {
    print "$s is NO match!!!\n";
  };
}

?>

Las impresiones anteriores ( como se ve en ideone.com ):

screen123.css is a match
screen-new-file.css is a match
screen_new.js is a match
screen new file.css is NO match!!!

Tenga en cuenta que el patrón es ligeramente diferente, usando en su \wlugar. Esta es la clase de carácter para "carácter de palabra".

Referencias API


Nota sobre la especificación

Esto parece seguir su especificación, pero tenga en cuenta que esto coincidirá con cosas como ....., etc., que pueden o no ser lo que desea. Si puede ser más específico con el patrón que desea hacer coincidir, la expresión regular será un poco más complicada.

La expresión regular anterior también coincide con la cadena vacía. Si necesita al menos un carácter, utilice +(uno o más) en lugar de *(cero o más) para la repetición.

En cualquier caso, puede aclarar aún más su especificación (siempre ayuda cuando hace una pregunta de expresiones regulares), pero con suerte también puede aprender a escribir el patrón usted mismo dada la información anterior.

poligenelubricantes
fuente
Consulte también ideone.com/5DMCa para obtener una especificación diferente que puede ser más de lo que desea. Vaya y venga conmigo en rubular si desea desarrollar la especificación conmigo.
polygenelubricants
Estoy usando Tornado y necesito capturar nombres html, así que usé esto basándome en tu respuesta; ^/([a-zA-Z0-9._-]*\.html)$
NuclearPeon
Agregaría otra regla que es: el último carácter debe ser alfanumérico. Regex actualizado:/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+){2,}[a-zA-Z0-9^]$/
Consta Gorgan
Usuarios de Go (golang), aviso, el patrón aquí dará como resultado falseliterales de cadena sin formato vacíos. Patio de recreo . Utilice la solución de @ nonopolarity a continuación .
BentCoder
15

puedes usar

^[\w\d_.-]+$

el +es para asegurarse de que tiene al menos 1 carácter. Necesita ^y $para indicar el comienzo y el final; de lo contrario, si la cadena tiene una coincidencia en el medio, @@@@xyz%%%%entonces todavía es una coincidencia.

no polaridad
fuente
3
Ponga el -primero en el conjunto, para evitar definir un rango. Y \wcubre alfanuméricos y subrayado. Entonces lo necesitas [\w.-]+.
Richard
Gracias, esto funciona bien para mí: ^ [\ w \ d _.-] + \. (Csv | CSV) $
Dharam Mali
Esto también cumple con los literales de cadena sin formato vacíos de Go (golang), mientras que la respuesta aceptada no lo hace, por lo que los usuarios de Go se quedan con esta solución. Playground
BentCoder
8

Para cubrir realmente su patrón, es decir, nombres de archivo válidos de acuerdo con sus reglas, creo que necesita un poco más. Tenga en cuenta que esto no coincide con los nombres de archivos legales desde la perspectiva del sistema . Eso dependería del sistema y sería más liberal en lo que acepta. Esto está destinado a coincidir con sus patrones aceptables.

^([a-zA-Z0-9]+[_-])*[a-zA-Z0-9]+\.[a-zA-Z0-9]+$

Explicación:

  • ^Coincide con el comienzo de una cadena. Esto (más la coincidencia final) obliga a la cadena a ajustarse a la expresión exacta, no simplemente a contener una subcadena que coincida con la expresión.
  • ([a-zA-Z0-9]+[_-])*Cero o más ocurrencias de una o más letras o números seguidos de un guión bajo o guión. Esto hace que todos los nombres que contienen un guión o un guión bajo tengan letras o números entre ellos.
  • [a-zA-Z0-9]+Una o más letras o números. Esto cubre todos los nombres que no contienen un guión bajo ni un guión.
  • \.Un punto literal (punto). Obliga a que el nombre del archivo tenga una extensión y, por exclusión del resto del patrón, solo permite que se use el punto entre el nombre y la extensión. Si desea más de una extensión que pueda manejarse también usando la misma técnica que para el guión / guión bajo, solo al final.
  • [a-zA-Z0-9]+Una o más letras o números. La extensión debe tener al menos un carácter y solo debe contener letras y números. Esto es típico, pero si quisiera permitir guiones bajos, eso también podría abordarse. También puede proporcionar un rango de longitud en {2,3}lugar de uno o más +comparadores, si fuera más apropiado.
  • $Coincide con el final de la cuerda. Vea el personaje inicial.
tvanfosson
fuente
6

Este es el patrón que estás buscando

/^[\w-_.]*$/

Lo que esto significa:

  • ^ Inicio de cadena
  • [...] Coincidir con los personajes del interior
  • \w Cualquier carácter de palabra 0-9 a-z A-Z
  • -_. Partido - y _y.
  • * Cero o más de patrón o ilimitado
  • $ Fin de cadena

Si desea limitar la cantidad de caracteres:

/^[\w-_.]{0,5}$/

{0,5}Significa 0-5personajes

Fletcher Ripp
fuente
var a = / ^ \ w * $ / g a.test ("46545") y el resultado fue falso
Dipak
1
Aviso que \wincluye_
hxpax
4

Algo como esto debería funcionar

$code = "screen new file.css";
if (!preg_match("/^[-_a-zA-Z0-9.]+$/", $code))
{
    echo "not valid";
}

Esto hará eco de "no válido"


fuente
2

[A-Za-z0-9_.-]*

Esto también coincidirá con las cadenas vacías, si no desea que cambie la última *por una+

Científico loco
fuente