expression régulière pour les lettres, les chiffres et – _

J’ai du mal à vérifier en PHP si une valeur est l’une des combinaisons suivantes

  • lettres (majuscules ou minuscules)
  • chiffres (0-9)
  • souligner (_)
  • tiret (-)
  • point (.)
  • sans espaces! ou d’autres personnages

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, car j’ai besoin de lancer une erreur lorsqu’une chaîne de données contient d’autres caractères que ceux mentionnés ci-dessus.

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

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

Explication:

  • ^ est le début de la ligne d’ancrage
  • $ est la fin de la ligne d’ancrage
  • [...] est une définition de classe de caractères
  • * est la 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.-à-d. La plage). Le . a également une signification différente en dehors des définitions de classe de caractères, mais à l’intérieur, c’est juste un littéral .

Les références

  • regular-expressions.info/Ancrages , classes de caractère et répétition

En PHP

Voici un extrait pour montrer comment vous pouvez utiliser ce modèle:

  

Les copies ci-dessus ( comme on le voit 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 motif est légèrement différent en utilisant \w place. Ceci est la classe de caractère pour “mot caractère”.

Références API

  • preg_match

Note sur la spécification

Cela semble suivre vos spécifications, mais notez que cela correspondra à des choses comme ..... , etc., qui peuvent ou non être ce que vous désirez. Si vous pouvez être plus précis quel modèle vous voulez faire correspondre, le regex sera légèrement plus compliqué.

La regex ci-dessus correspond également à la chaîne vide. Si vous avez besoin d’au moins un caractère, utilisez plutôt + (un ou plusieurs) au lieu de * (zéro ou plus) pour la répétition.

Dans tous les cas, vous pouvez clarifier davantage vos spécifications (aide toujours lorsque vous posez une question de regex), mais vous pouvez également apprendre à écrire le modèle vous-même en fonction des informations ci-dessus.

vous pouvez utiliser

 ^[\w\d_.-]+$ 

le + doit s’assurer qu’il a au moins 1 caractère. Besoin de ^ et de $ pour indiquer le début et la fin, sinon si la chaîne a une correspondance au milieu, telle que @@@@xyz%%%% alors c’est toujours une correspondance.

Pour couvrir réellement votre modèle, à savoir 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 du sharepoint vue du système . Ce serait dépendant du système et 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:

  • ^ correspondre le début d’une chaîne. Cela (plus la fin de la correspondance) force la chaîne à se conformer à l’expression exacte, et pas simplement à contenir une sous-chaîne correspondant à l’expression.
  • ([a-zA-Z0-9]+[_-])* Zéro ou plusieurs occurrences d’une ou plusieurs lettres ou chiffres suivies d’un trait de soulignement ou d’un tiret. Cela fait que tous les noms contenant un tiret ou un trait de soulignement ont des lettres ou des chiffres entre eux.
  • [a-zA-Z0-9]+ Une ou plusieurs lettres ou chiffres. Cela couvre tous les noms qui ne contiennent pas de trait de soulignement ou de tiret.
  • \. Une période littérale (point). Force le nom du fichier à avoir une extension et, à l’exclusion du rest du modèle, n’autorise que la période à utiliser entre le nom et l’extension. Si vous voulez plus d’une extension, utilisez la même technique que pour le tiret / trait de soulignement, juste à la fin.
  • [a-zA-Z0-9]+ Une ou plusieurs lettres ou chiffres. L’extension doit comporter au moins un caractère et ne doit contenir que des lettres et des chiffres. Ceci est typique, mais si vous vouliez autoriser les traits de soulignement, cela pourrait également être abordé. Vous pourriez également fournir une plage de longueur {2,3} au lieu de un ou plusieurs + matcher, si cela était plus approprié.
  • $ Correspond à la fin de la chaîne. Voir le caractère de départ.

Quelque chose comme ça devrait fonctionner

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

Cela fera écho “non valide”

C’est le modèle que vous recherchez

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

Qu’est-ce que cela signifie:

  • ^ Début de chaîne
  • [...] Match des caractères à l’intérieur
  • \w N’importe quel caractère mot 0-9 az AZ
  • -_. Match ‘-‘ et ‘_’ et ‘.’
  • * Zéro ou plus du motif ou illimité
  • $ Fin de chaîne

Si vous souhaitez limiter la quantité de caractères:

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

{0,5} Moyens 0-5 caractères

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

Cela correspondra également aux chaînes vides, si vous ne voulez pas que le dernier échange * pour un +