2013-08-06 16 views
5

Ho bisogno di 1 espressione regolare per mettere restrizioni sui tipi di file usando la sua estensione.Espressione regolare per estensione del file

Ho provato questo per limitare il tipo di file di html, .class, ecc

  1. /(\.|\/)[^(html|class|js|css)]$/i
  2. /(\.|\/)[^html|^class|^js|^css]$/i

ho bisogno di limitare un totale di 10-15 tipi di file . Nella mia applicazione c'è un campo per il tipo di file accettato, e in base al requisito che ho i tipi di file che deve essere limitato. Quindi ho bisogno di un'espressione regolare usando solo la negazione del tipo di file limitato.

Il codice del plugin è come:

$('#fileupload').fileupload('option', { 
      acceptFileTypes: /(\.|\/)(gif|jpe?g|png|txt)$/i 
}); 

posso specificare l'acceptedFileType ma ho dato l'obbligo di limitare un insieme di file.

+0

Javascript? O quale lingua? – xanatos

+2

Probabilmente sarà più semplice avere un ciclo e confrontare l'estensione del file con ciascuna delle estensioni nell'elenco. Se un'estensione corrisponde, interrompi il ciclo e impedisci al file di andare oltre. – Jerry

+0

Effettuare un'espressione regolare per la corrispondenza dei tipi di file con restrizioni. Se corrisponde a DON "T do it –

risposta

14

Prova /^(.*\.(?!(htm|html|class|js)$))?[^.]*$/i

Provalo qui: http://regexr.com?35rp0

Sarà anche lavorare con i file senza estensione.

Come tutte le regex, è complessa da spiegare ... Partiamo dalla fine

[^.]*$ 0 or more non . characters 
(...)? if there is something before (the last ?) 

.*\.(?!(htm|html|class|js)$) Then it must be any character in any number .* 
          followed by a dot \. 
          not followed by htm, html, class, js (?! ...) 
          plus the end of the string $ 
          (this so that htmX doesn't trigger the condition) 

^ the beginning of the string 

Questo (?!(htm|html|class|js) è chiamato a zero lookahead negativo larghezza. Viene spiegato almeno 10 volte al giorno su SO, quindi puoi guardare ovunque :-)

+0

Non funziona per: 'test.str.html', per esempio. – Gray

+0

Corrisponde alla stringa vuota. Non so se sia cattivo o no. –

+1

Spiega il lookahead negato. Sarebbe una risposta migliore in questo modo. –

2

Ti sembra di fraintendere come funziona una classe di caratteri. Una classe di caratteri corrisponde solo a un singolo personaggio. Il personaggio scelto è quello di tutti loro lì dentro. Così, il vostro classe di caratteri:

[^(html|class|js|css)] 

non corrisponde html o class in sequenza. Corrisponde a un singolo personaggio rispetto a tutti i personaggi distinti di quella classe.

Detto questo, per il particolare compito, è necessario utilizzare negativo look-ahead:

/(?!.*[.](?:html|class|js|css)$).*/ 

Tuttavia, vorrei anche considerare utilizzando la libreria String nel mio rispettive lingue, invece di usando regex, per raggiungere questo compito. Hai solo bisogno di testare, se la stringa termina con una di quelle estensioni.

+0

Negli Stati Uniti e in inglese britannico, "quello detto" significa "comunque". Significa qualcosa di diverso in inglese indiano? – ruakh

+0

@ruakh Nella mia parte degli Stati Uniti, significa "in aggiunta" o "un altro modo di guardarlo" –

+0

@ruakh. Qui significa - "in aggiunta a quello". –

2

Se si è aperti all'utilizzo di JQuery, si potrebbe considerare di ignorare l'espressione regolare tutti insieme e di utilizzare una serie di estensioni valide:

// store the file extensions (easy to maintain, if changesa are needed) 
var aValidExtensions = ["htm", "html", "class", "js"]; 
// split the filename on "." 
var aFileNameParts = file_name.split("."); 

// if there are at least two pieces to the file name, continue the check 
if (aFileNameParts.length > 1) { 
    // get the extension (i.e., the last "piece" of the file name) 
    var sExtension = aFileNameParts[aFileNameParts.length-1]; 

    // if the extension is in the array, return true, if not, return false 
    return ($.inArray(sExtension, aValidExtensions) >= 0) ? true : false; 
} 
else { 
    return false; // invalid file name format (no file extension) 
} 

Il grande vantaggio qui è nella facilità di manutenzione. . . la modifica delle estensioni di file accettabili è un rapido aggiornamento dell'array (o anche una proprietà o un aggiornamento CMS, a seconda di quanto siano fantasiose le cose :)). Inoltre, regex ha l'abitudine di essere un processo poco intensivo, quindi dovrebbe essere più efficiente (anche se non ho ancora testato questo caso particolare).

+0

questo codice non usa regex, ma funziona bene. Grazie. è meglio usare var aFileNameParts = nome_file.toLowerCase(). split (".") invece della riga 4 – mhdrad