202 votes

Expression régulière pour les lettres, les chiffres et - _

Je ne parviens pas à vérifier en PHP si une valeur correspond à l'une des combinaisons suivantes

  • lettres (majuscules ou minuscules)
  • chiffres (0-9)
  • trait de soulignement (_)
  • tiret (-)
  • point (.)
  • pas d'espaces ! ni d'autres caractères

quelques exemples :

  • OK : "screen123.css"
  • OK : "screen-new-file.css"
  • OK : "screen_new.js"
  • PAS OK : "screen new file.css"

Je suppose que j'ai besoin d'une expression rationnelle pour cela, puisque j'ai besoin de lancer une erreur lorsqu'une chaîne donnée contient d'autres caractères que ceux mentionnés ci-dessus.

355voto

polygenelubricants Points 136838

Le modèle que vous souhaitez obtenir est quelque chose comme ( voir sur rubular.com ) :

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

Explication :

  • ^ est le début de l'ancre de ligne
  • $ est la fin de l'ancre de ligne
  • [...] est une définition de classe de caractères
  • * est une répétition "zéro ou plus".

Notez que le tiret littéral - est le dernier caractère de la définition de la classe de caractères, sinon il a une signification différente (c'est-à-dire un intervalle). Le caractère . a également une signification différente en dehors des définitions des classes de caractères, mais à l'intérieur, il s'agit simplement d'une valeur littérale de .

Références


En PHP

Voici un extrait qui montre comment vous pouvez utiliser ce modèle :

<?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";
  };
}

?>

Les impressions ci-dessus ( tel que vu sur 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!!!

Notez que le modèle est légèrement différent, utilisant \w au lieu de cela. Il s'agit de la classe de caractères pour le "caractère de mot".

Références API


Note sur les spécifications

Cela semble correspondre à votre spécification, mais notez que cela correspondra à des choses comme ..... etc., ce qui peut correspondre ou non à ce que vous souhaitez. Si vous pouvez être plus précis quant au motif que vous souhaitez faire correspondre, l'expression rationnelle sera légèrement plus compliquée.

L'expression rationnelle ci-dessus correspond également à la chaîne vide. Si vous avez besoin d'au moins un caractère, utilisez alors + (un ou plus) au lieu de * (zéro ou plus) pour la répétition.

Dans tous les cas, vous pouvez clarifier davantage votre spécification (ce qui est toujours utile lorsque l'on pose une question sur les expressions rationnelles), mais j'espère que vous pourrez également apprendre à écrire le motif vous-même à partir des informations ci-dessus.

50voto

動靜能量 Points 33008

Vous pouvez utiliser

^[\w.-]+$

les + est de s'assurer qu'il comporte au moins un caractère. Il faut que le ^ y $ pour indiquer le début et la fin, sinon si la chaîne a une correspondance au milieu, comme par exemple @@@@xyz%%%% il s'agit toujours d'une correspondance.

\w comprend déjà les alphabets (majuscules et minuscules), les chiffres et les traits de soulignement. Le reste . , - sont simplement placés dans la "classe" correspondante. Les + signifie une occurrence ou plus.

P.S. Merci pour la note dans le commentaire sur la prévention. - pour désigner un intervalle.

18voto

Fletcher Ripp Points 402

Voici le modèle que vous recherchez

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

Ce que cela signifie :

  • ^ Début de la chaîne
  • [...] Faire correspondre les caractères à l'intérieur
  • \w Tout caractère de mot ainsi 0-9 a-z A-Z
  • -_. Correspondance - y _ y .
  • * Zéro ou plus d'un modèle ou illimité
  • $ Fin de la chaîne

Si vous souhaitez limiter le nombre de caractères :

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

{0,5} Moyens 0-5 personnages

12voto

tvanfosson Points 268301

Pour couvrir votre modèle, c'est-à-dire les noms de fichiers valides selon vos règles, je pense que vous avez besoin d'un peu plus. Notez que cela ne correspond pas aux noms de fichiers légaux d'un fichier système perspective. Cela dépendrait du système et serait plus libéral dans ce qu'il accepte. Ceci est destiné à correspondre à vos modèles acceptables.

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

Explication :

  • ^ Correspond au début d'une chaîne de caractères. Cette correspondance (ainsi que la correspondance de fin) oblige la chaîne à se conformer à l'expression exacte, et pas seulement à contenir une sous-catégorie correspondant à l'expression.
  • ([a-zA-Z0-9]+[_-])* Zéro ou plusieurs occurrences d'une ou plusieurs lettres ou chiffres suivis d'un trait de soulignement ou d'un tiret. Ainsi, tous les noms contenant un tiret ou un trait de soulignement sont séparés par des lettres ou des chiffres.
  • [a-zA-Z0-9]+ Une ou plusieurs lettres ou chiffres. Il s'agit de tous les noms qui ne contiennent pas de trait de soulignement ou de tiret.
  • \. Un point littéral (point). Force le nom du fichier à avoir une extension et, par exclusion du reste du motif, n'autorise l'utilisation du point qu'entre le nom et l'extension. Si vous souhaitez plus d'une extension, vous pouvez utiliser la même technique que pour le tiret/le point de suspension, mais à la fin.
  • [a-zA-Z0-9]+ Une ou plusieurs lettres ou chiffres. L'extension doit être composée d'au moins un caractère et ne doit contenir que des lettres et des chiffres. Il s'agit là d'un cas typique, mais si vous souhaitez autoriser les caractères de soulignement, vous pouvez également le faire. Vous pouvez également fournir une plage de longueur {2,3} au lieu d'un ou plusieurs + si cela était plus approprié.
  • $ Correspond à la fin de la chaîne. Voir le caractère de départ.

6voto

Cela devrait fonctionner de la manière suivante

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

L'écho sera "non valide"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X