Überprüfen von Dateitypen durch reguläre Ausdrücke

77

Ich habe ein .NET-Webformular mit einem Steuerelement zum Hochladen von Dateien, das an einen Validator für reguläre Ausdrücke gebunden ist. Dieser Validator muss überprüfen, ob nur bestimmte Dateitypen zum Hochladen zugelassen werden sollen (jpg, gif, doc, pdf).

Der aktuelle reguläre Ausdruck, der dies tut, lautet:


^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.jpg|.JPG|.gif|.GIF|.doc|.DOC|.pdf|.PDF)$

Dies scheint jedoch nicht zu funktionieren ... kann mir jemand ein wenig Hilfe geben?

mmattax
quelle
18
Ich bin mir sicher, dass Sie das wissen, aber falls jemand später diese Frage findet, der dies nicht tut: Diese Methode überprüft nur die Dateierweiterung, nicht den tatsächlichen Typ. Sobald Sie die Datei erhalten haben, müssen Sie ihren Inhalt überprüfen, um festzustellen, was sie wirklich ist. Wenn Sie sich auf den Namen verlassen, ist dies eine große Sicherheitslücke.
Dave Sherohman

Antworten:

167

Ihre Regex scheint meiner Meinung nach etwas zu komplex. Denken Sie auch daran, dass der Punkt ein Sonderzeichen ist, das "beliebiges Zeichen" bedeutet. Der folgende reguläre Ausdruck sollte funktionieren (beachten Sie die maskierten Punkte):

^.*\.(jpg|JPG|gif|GIF|doc|DOC|pdf|PDF)$

Sie können ein Tool wie Expresso verwenden , um Ihre regulären Ausdrücke zu testen.

Dario Solera
quelle
Wenn Sie reguläre Ausdrücke in .NET ausführen, ist es nicht erforderlich, Groß- und Kleinschreibung aufzuzeichnen. Dies kann nicht nur die Lesbarkeit beeinträchtigen, sondern auch die Leistung beeinträchtigen, wenn es beispielsweise in einer Schleife aufgerufen wird.
Joseph Ferris
2
Das Problem besteht darin, dass der reguläre Ausdruck in einem RegularExpressionValidator ASP.NET-Steuerelement verwendet wird, das von AFAIK keine Optionen wie IgnoreCase akzeptiert.
Dario Solera
Ich habe das im ursprünglichen Beitrag verpasst. Ja, die Optionen für die Groß- und Kleinschreibung von RegularExpressionValidator werden von Microsoft seit einigen Jahren ignoriert.
Joseph Ferris
1
Sie können das ^. * Auslassen, da "alles von Anfang an bis zu diesem Ausdruck am Ende abgleichen" mit "diesen Ausdruck am Ende abgleichen" identisch ist. Sie können auch Optionen für
ICR
Um die Option für reguläre Ausdrücke einzubetten, um Groß- und Kleinschreibung zu ignorieren, müssen Sie das ClientSide-Skript deaktivieren (ich glaube nicht, dass JavaScript dies unterstützt). Sie können dann "(? I :. (Jpg | gif | doc | pdf)) $" für eine Übereinstimmung verwenden, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird.
Martin Brown
19
^.+\.(?:(?:[dD][oO][cC][xX]?)|(?:[pP][dD][fF]))$

Akzeptiert DOC-, DOCX- und PDF-Dateien mit einem Dateinamen von mindestens einem Zeichen:

^           = beginning of string
.+          = at least one character (any character)
\.          = dot ('.')
(?:pattern) = match the pattern without storing the match)
[dD]        = any character in the set ('d' or 'D')
[xX]?       = any character in the set or none 
              ('x' may be missing so 'doc' or 'docx' are both accepted)
|           = either the previous or the next pattern
$           = end of matched string

Warnung! Ohne die gesamte Kette von Erweiterungen in (? :) einzuschließen, würde eine Erweiterung wie .docpdf übergeben.

Sie können reguläre Ausdrücke unter http://www.regextester.com/ testen.

mdunka
quelle
15

Möchten Sie nur überprüfen, ob die Datei eine bestimmte Erweiterung hat? Sie können vereinfachen, was Sie mit so etwas tun möchten:

(.*?)\.(jpg|gif|doc|pdf)$

Wenn Sie dann IsMatch () aufrufen, müssen Sie RegexOptions.IgnoreCase als zweiten Parameter übergeben. Es gibt keinen Grund, die Varianten für das Gehäuse auflisten zu müssen.

Bearbeiten: Wie Dario erwähnt, funktioniert dies für den RegularExpressionValidator nicht, da keine Gehäuseoptionen unterstützt werden.

Joseph Ferris
quelle
1
Dieser erlaubt es, Punkte in den Dateinamen aufzunehmen, was für mich in
Ordnung
12

Sie können Groß- und Kleinschreibung in den regulären Ausdruck wie folgt einbetten:

\.(?i:)(?:jpg|gif|doc|pdf)$
ICR
quelle
1
Dies schlägt jedoch fehl, wenn Sie die Client-Skriptoption aktiviert lassen.
Martin Brown
Afaik Javascript erlaubt zwar Inline-Optionen, gilt jedoch für den gesamten regulären Ausdruck und nicht nur für alles danach, was in diesem Fall keine Rolle spielt. Es sei denn, es gibt einen anderen Grund, warum es nicht funktioniert (ich kann atm nicht testen).
ICR
2
Nein, JS unterstützt überhaupt keine Inline-Modifikatoren. Außerdem funktioniert Ihre Regex auch in .NET nicht. Sie möchten entweder "\. (? i) (?: jpg | gif | doc | pdf) $" oder "\. (? i: jpg | gif | doc | pdf) $". Dies: "(? I :)" entspricht einfach nichts, ohne Berücksichtigung der Groß- und Kleinschreibung.
Alan Moore
6

Sie können diese Vorlage für jeden Dateityp verwenden:

ValidationExpression="^.+\.(([pP][dD][fF])|([jJ][pP][gG])|([pP][nN][gG])))$"

Zum Beispiel: Sie können ( [rR][aA][rR]) für den Dateityp Rar hinzufügen und ...

Sajjad mc
quelle
5

Ihr regulärer Ausdruck scheint sowohl den Dateinamen als auch die Erweiterung zu überprüfen. Benötigen Sie das? Ich gehe davon aus, dass es nur die Erweiterung ist und würde einen regulären Ausdruck wie diesen verwenden:

\.(jpg|gif|doc|pdf)$

Stellen Sie die Übereinstimmung so ein, dass die Groß- und Kleinschreibung nicht berücksichtigt wird.

PEZ
quelle