regulärer Ausdruck für Buchstaben, Zahlen und - _

96

Ich habe Probleme beim Überprüfen von PHP, ob ein Wert eine der folgenden Kombinationen ist

  • Buchstaben (Groß- oder Kleinbuchstaben)
  • Zahlen (0-9)
  • Unterstrich (_)
  • Bindestrich (-)
  • Punkt (.)
  • kein Platz! oder andere Zeichen

einige Beispiele:

  • OK: "screen123.css"
  • OK: "screen-new-file.css"
  • OK: "screen_new.js"
  • NICHT OK: "Bildschirm neue Datei.css"

Ich denke, ich brauche dafür einen regulären Ausdruck, da ich einen Fehler auslösen muss, wenn eine Give-Zeichenfolge andere Zeichen als die oben genannten enthält.

Jorre
quelle
^ [\ w .-] * $ -> Dies erhält den Dateinamen all.
Badri Gs

Antworten:

201

Das gewünschte Muster ist ungefähr so ( siehe auf rubular.com ):

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

Erläuterung:

  • ^ ist der Anfang des Linienankers
  • $ ist das Ende des Linienankers
  • [...] ist eine Zeichenklassendefinition
  • * ist eine Wiederholung von "null oder mehr"

Beachten Sie, dass der Literalstrich -das letzte Zeichen in der Zeichenklassendefinition ist, andernfalls hat er eine andere Bedeutung (dh einen anderen Bereich). Das hat .auch außerhalb der Zeichenklassendefinitionen eine andere Bedeutung, aber innerhalb ist es nur ein Literal.

Verweise


In PHP

Hier ist ein Ausschnitt, der zeigt, wie Sie dieses Muster verwenden können:

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

?>

Die obigen Drucke ( wie auf ideone.com zu sehen ):

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!!!

Beachten Sie, dass das Muster etwas anders ist, wenn Sie \wstattdessen verwenden. Dies ist die Zeichenklasse für "Wortzeichen".

API-Referenzen


Hinweis zur Spezifikation

Dies scheint Ihrer Spezifikation zu folgen, aber beachten Sie, dass dies mit Dingen wie .....usw. übereinstimmt , die möglicherweise Ihren Wünschen entsprechen oder nicht. Wenn Sie genauer angeben können, mit welchem ​​Muster Sie übereinstimmen möchten, ist der reguläre Ausdruck etwas komplizierter.

Der obige reguläre Ausdruck stimmt auch mit der leeren Zeichenfolge überein. Wenn Sie mindestens ein Zeichen benötigen, verwenden Sie +(eins oder mehr) anstelle von *(null oder mehr) für die Wiederholung.

In jedem Fall können Sie Ihre Spezifikation weiter präzisieren (hilft immer beim Stellen von Regex-Fragen), aber hoffentlich können Sie auch lernen, wie Sie das Muster anhand der obigen Informationen selbst schreiben.

Polygenschmierstoffe
quelle
Siehe auch ideone.com/5DMCa für eine andere Spezifikation, die möglicherweise mehr Ihren Wünschen entspricht . Gehen Sie mit mir auf Rubular hin und her, wenn Sie die Spezifikation mit mir entwickeln möchten.
Polygenelubricants
Ich verwende Tornado und muss HTML-Namen erfassen, daher habe ich dies basierend auf Ihrer Antwort verwendet. ^/([a-zA-Z0-9._-]*\.html)$
NuclearPeon
Ich würde eine andere Regel hinzufügen, die lautet: Das letzte Zeichen sollte alphanumerisch sein. Aktualisierter Regex:/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+){2,}[a-zA-Z0-9^]$/
Consta Gorgan
Go (Golang) Benutzer, Heads Up, Muster hier führt falsezu leeren rohen String-Literalen. Spielplatz . Verwenden Sie die unten stehende Lösung von @ nonopolarity .
BentCoder
14

Sie können verwenden

^[\w\d_.-]+$

Das +soll sicherstellen, dass es mindestens 1 Zeichen hat. Benötigen Sie das ^und $, um den Anfang und das Ende zu bezeichnen, andernfalls, wenn die Zeichenfolge eine Übereinstimmung in der Mitte hat, z. B. @@@@xyz%%%%dann ist es immer noch eine Übereinstimmung.

Unpolarität
quelle
3
Setzen Sie den -ersten in das Set ein, um die Definition eines Bereichs zu vermeiden. Und \wdeckt alphanumerische Zeichen und Unterstriche ab. Also brauchst du [\w.-]+.
Richard
Danke, das funktioniert gut für mich: ^ [\ w \ d _.-] + \. (CSV | CSV) $
Dharam Mali
Dies entspricht auch den leeren rohen String-Literalen von Go (Golang), während die akzeptierte Antwort nicht dazu führt, dass Go-Benutzer an dieser Lösung festhalten. Spielplatz
BentCoder
7

Um Ihr Muster tatsächlich abzudecken, dh gültige Dateinamen gemäß Ihren Regeln, denke ich, dass Sie etwas mehr brauchen. Beachten Sie, dass dies aus Systemsicht nicht mit legalen Dateinamen übereinstimmt . Das wäre systemabhängig und liberaler in dem, was es akzeptiert. Dies soll Ihren akzeptablen Mustern entsprechen.

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

Erläuterung:

  • ^Passen Sie den Anfang einer Zeichenfolge an. Dies (plus die Endübereinstimmung) zwingt die Zeichenfolge, dem genauen Ausdruck zu entsprechen, und enthält nicht nur einen Teilstring, der mit dem Ausdruck übereinstimmt.
  • ([a-zA-Z0-9]+[_-])*Null oder mehr Vorkommen von einem oder mehreren Buchstaben oder Zahlen, gefolgt von einem Unterstrich oder Bindestrich. Dies führt dazu, dass alle Namen, die einen Bindestrich oder Unterstrich enthalten, Buchstaben oder Zahlen enthalten.
  • [a-zA-Z0-9]+Ein oder mehrere Buchstaben oder Zahlen. Dies umfasst alle Namen, die keinen Unterstrich oder Bindestrich enthalten.
  • \.Eine wörtliche Periode (Punkt). Erzwingt, dass der Dateiname eine Erweiterung hat, und lässt durch Ausschluss vom Rest des Musters nur den Zeitraum zwischen dem Namen und der Erweiterung zu. Wenn Sie mehr als eine Erweiterung möchten, die mit derselben Technik wie für den Bindestrich / Unterstrich behandelt werden kann, nur am Ende.
  • [a-zA-Z0-9]+Ein oder mehrere Buchstaben oder Zahlen. Die Erweiterung muss mindestens ein Zeichen lang sein und darf nur Buchstaben und Zahlen enthalten. Dies ist typisch, aber wenn Sie Unterstriche zulassen möchten, kann dies ebenfalls behoben werden. Sie könnten auch einen Längenbereich {2,3}anstelle des einen oder der mehreren +Matcher angeben, wenn dies angemessener wäre.
  • $Passen Sie das Ende der Zeichenfolge an. Siehe das Startzeichen.
Tvanfosson
quelle
6

Dies ist das Muster, nach dem Sie suchen

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

Was dies bedeutet:

  • ^ Beginn der Zeichenfolge
  • [...] Übereinstimmende Zeichen im Inneren
  • \w Beliebiges Wortzeichen also 0-9 a-z A-Z
  • -_.Match -und _und.
  • * Null oder mehr Muster oder unbegrenzt
  • $ Ende der Zeichenfolge

Wenn Sie die Anzahl der Zeichen begrenzen möchten:

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

{0,5}Bedeutet 0-5Zeichen

Fletcher Ripp
quelle
var a = / ^ \ w * $ / g a.test ("46545") und das Ergebnis war falsch
Dipak
1
Beachten Sie, dass \wenthält_
hxpax
4

So etwas sollte funktionieren

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

Dies gibt "ungültig" aus


quelle
2

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

Dies gilt auch für leere Zeichenfolgen, wenn Sie nicht möchten, dass die letzte *gegen eine ausgetauscht wird+

Verrückter Wissenschaftler
quelle