Domanda

Sto diventando sempre più consapevole che ci devono essere grandi differenze nei modi in cui le espressioni regolari saranno interpretate dai browser.
Ad esempio, un collega ha scritto questa espressione regolare, per confermare che un file che si sta caricando avrebbe un'estensione PDF:

^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.pdf)$

Funziona in Internet Explorer e in Google Chrome, ma NON funziona in Firefox. Il test fallisce sempre, anche per un PDF reale. Così ho deciso che le cose extra erano irrilevanti e l'ho semplificata in:

^.+\.pdf$

e ora funziona bene su Firefox, oltre a continuare a funzionare su Internet Explorer e Chrome.
È una stranezza specifica di asp: controlli FileUpload e RegularExpressionValidator in ASP.NET o è semplicemente dovuta a browser diversi che supportano regex in modi diversi? Ad ogni modo, quali sono alcuni di questi ultimi che hai riscontrato?

È stato utile?

Soluzione

Per quanto ne so firefox non ti consente di avere il percorso completo di un caricamento. L'interpretazione delle espressioni regolari sembra irrilevante in questo caso. Devo ancora vedere alcuna differenza tra i browser moderni nell'esecuzione di espressioni regolari.

Altri suggerimenti

Riguardo alla domanda reale: la regex originale richiede che il valore inizi con una lettera di unità o un nome di dispositivo UNC. È possibile che Firefox semplicemente non lo includa con il nome file. Nota anche che, se hai intenzione di essere multipiattaforma, quel regex fallirebbe su qualsiasi sistema non Windows, indipendentemente dal browser, poiché non usano lettere di unità o percorsi UNC. La tua regex semplificata (" accetta qualsiasi cosa, fintanto che termina con .pdf ") è circa un controllo del nome del file che otterrai.

Tuttavia , il commento di Jonathan alla domanda originale non può essere enfatizzato. Mai, mai, mai il nome del file è considerato un mezzo adeguato per determinarne il contenuto. O il tipo MIME, del resto. Il software client che parla al tuo server web (che potrebbe non essere nemmeno un browser) può mentirti su qualsiasi cosa e non lo saprai mai se non lo verifichi. In questo caso, ciò significa inserire il file ricevuto in un codice che capisca il formato PDF e che quel codice ti dica se è un PDF valido o meno. Il controllo del nome file può aiutare a impedire alle persone di provare a inviare file ovviamente errati, ma non è un test sufficiente dei file ricevuti.

(Mi rendo conto che potresti conoscere la necessità di un'ulteriore convalida, ma la persona successiva che ha una situazione simile e trova la tua domanda potrebbe non farlo.)

Se stai usando JavaScript, non racchiudere la regex con le barre provoca errore in Firefox.

Prova a fare var regex = /^(([a-zA-Z×:)|(\\{2}\w+)\$?)(\\(\w[\w[.* )) (pdf) $ /;.

Come menzionato Dave, Firefox non fornisce il percorso, ma solo il nome del file. Inoltre, come ha detto, non tiene conto delle differenze tra i sistemi operativi. Penso che il miglior controllo che potresti fare sarebbe quello di verificare se il nome del file termina con PDF. Inoltre, questo non garantisce che sia un PDF valido, solo che il nome del file termina con PDF. A seconda delle tue esigenze, potresti voler verificare che sia effettivamente un PDF controllando il contenuto.

Non ho notato differenze tra i browser per quanto riguarda la sintassi del pattern. Tuttavia, ho notato una differenza tra C # e Javascript poiché l'implementazione di C # consente riferimenti a ritroso e l'implementazione di Javascript no.

Credo che i RE JavaScript siano definiti dallo standard ECMA e dubito che ci siano molte differenze tra gli interpreti JS. Non ne ho trovato nessuno, nei miei programmi, o visto citato in un articolo.

Il tuo messaggio è in realtà un po 'confuso, dal momento che hai inserito cose ASP. Non vedo come si concluda che è colpa del browser quando si parla di tecnologia lato server o codice generato. In realtà, non sappiamo nemmeno se stai parlando di JS sul browser, della validazione del campo di upload (non puoi più farlo, almeno in modo semplice, con FF3) o sul lato server (né FF né Opera né Safari carica l'intero percorso del file caricato. Sono sorpreso di apprendere che a Chrome piace IE ...).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top