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.
Réponses:
Le modèle que vous voulez est quelque chose comme ( voir sur rubular.com ):
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:
Les impressions ci-dessus ( comme vu sur ideone.com ):
Notez que le modèle est légèrement différent, en utilisant à la
\w
place. Il s'agit de la classe de caractères pour "caractère de mot".Références API
preg_match
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.
la source
^/([a-zA-Z0-9._-]*\.html)$
/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+){2,}[a-zA-Z0-9^]$/
false
des littéraux de chaîne bruts vides. Aire de jeux . Utilisez la solution de @ nonopolarity ci-dessous .vous pouvez utiliser
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.la source
-
premier dans l'ensemble, pour éviter de définir une plage. Et\w
couvre les caractères alphanumériques et les traits de soulignement. Donc vous avez besoin[\w.-]+
.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.
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.la source
C'est le modèle que vous recherchez
Qu'est-ce que cela signifie:
^
Début de chaîne[...]
Faites correspondre les personnages à l'intérieur\w
Tout caractère de mot donc0-9
a-z
A-Z
-_.
Match-
et_
et.
*
Zéro ou plus de motif ou illimité$
Fin de chaîneSi vous souhaitez limiter le nombre de caractères:
{0,5}
Signifie des0-5
personnagesla source
\w
comprend_
Quelque chose comme ça devrait fonctionner
Cela fera écho "non valide"
la source
[A-Za-z0-9_.-]*
Cela correspondra également aux chaînes vides, si vous ne voulez pas que l'échange soit le dernier
*
pour un+
la source