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

100

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 régulière pour cela, car je dois lancer une erreur lorsqu'une chaîne de données contient d'autres caractères que ceux mentionnés ci-dessus.

Jorre
la source
^ [\ w .-] * $ -> Cela obtiendra le nom de tous les fichiers.
Badri Gs

Réponses:

207

Le modèle que vous voulez 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 une 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.

Références


En PHP

Voici un extrait de code pour montrer 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 ( comme 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, en utilisant à la \wplace. Il s'agit de la classe de caractères pour "caractère de mot".

Références API


Remarque sur les spécifications

Cela semble suivre votre spécification, 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 sur le modèle que vous souhaitez associer, l'expression régulière sera légèrement plus compliquée.

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

Dans tous les cas, vous pouvez clarifier davantage votre spécification (cela aide toujours lorsque vous posez une question regex), mais j'espère que vous pourrez également apprendre à écrire le modèle vous-même compte tenu des informations ci-dessus.

lubrifiants polygènes
la source
Voir aussi ideone.com/5DMCa pour une spécification différente qui peut être plus ce que vous voulez. Faites des allers-retours avec moi sur rubular si vous souhaitez développer la spécification avec moi.
polygenelubricants
J'utilise Tornado et j'ai besoin de capturer les noms html, donc j'ai utilisé ceci en fonction de votre réponse; ^/([a-zA-Z0-9._-]*\.html)$
NuclearPeon
J'ajouterais une autre règle qui est: le dernier caractère doit être un alphanumérique. Regex mis à jour:/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+){2,}[a-zA-Z0-9^]$/
Consta Gorgan
Go (golang) utilisateurs, la tête haute, le motif ici entraînera falsedes littéraux de chaîne bruts vides. Aire de jeux . Utilisez la solution de @ nonopolarity ci-dessous .
BentCoder le
15

vous pouvez utiliser

^[\w\d_.-]+$

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

nonopolarité
la source
3
Mettez le -premier dans l'ensemble, pour éviter de définir une plage. Et \wcouvre les caractères alphanumériques et les traits de soulignement. Donc vous avez besoin [\w.-]+.
Richard
Merci, cela fonctionne très bien pour moi: ^ [\ w \ d _.-] + \. (Csv | CSV) $
Dharam Mali
Cela est également conforme aux littéraux de chaîne brute vides de Go (golang), alors que la réponse acceptée ne le fait pas, donc les utilisateurs de Go s'en tiennent à cette solution. Playground
BentCoder
8

Pour couvrir réellement votre modèle, c'est-à-dire des 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 point de 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:

  • ^Correspond au début d'une chaîne. Ceci (plus la correspondance de fin) force la chaîne à se conformer à l'expression exacte, 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 suivis d'un trait de soulignement ou d'un tiret. Cela provoque tous les noms qui contiennent un tiret ou un trait de soulignement pour avoir 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 de fichier à avoir une extension et, par exclusion du reste du modèle, autorise uniquement l'utilisation du point entre le nom et l'extension. Si vous voulez plus d'une extension qui pourrait être gérée aussi bien en utilisant la même technique que pour le tiret / 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. C'est typique, mais si vous vouliez autoriser les traits de soulignement, cela pourrait également être résolu. Vous pouvez également fournir une plage de longueurs {2,3}au lieu d'un ou plusieurs correspondants +, si cela était plus approprié.
  • $Correspond à la fin de la chaîne. Voir le personnage de départ.
Tvanfosson
la source
6

C'est le modèle que vous recherchez

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

Qu'est-ce que cela signifie:

  • ^ Début de chaîne
  • [...] Faites correspondre les personnages à l'intérieur
  • \w Tout caractère de mot donc 0-9 a-z A-Z
  • -_.Match -et _et.
  • * Zéro ou plus de motif ou illimité
  • $ Fin de chaîne

Si vous souhaitez limiter le nombre de caractères:

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

{0,5}Signifie des 0-5personnages

Fletcher Ripp
la source
var a = / ^ \ w * $ / g a.test ("46545") et le résultat était faux
Dipak
1
Notez que \wcomprend_
hxpax
4

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"


la source
2

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

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

Scientifique fou
la source