PDA

Visualizza la versione completa : RE per estrarre estensione file


Mich_
10-12-2003, 10:06
Eccomi ancora alle prese con le RE.

Oggi ho un problema che da solo non riesco a risolvere.

Data una lista di file, che pero` comprendono path complete (quindi con anche dei possibili punti dentro il path o all'inizio, vorrei estrarre l'estensione dei file. Il problema e` che questi file sono estratti da pagine web, per cui possono anche avere un ? (e successivi parametri) dopo l'estensione.

Magari e` una cosa impossibile, ed occorre procedere spezzando la stringa, ma una soluzione con una RE sarebbe piu` elegante e compatta.

Alcuni esempi di path (non esaustivi):
/ministero/sezMinistero_files/frecciamenu1.gif
../sezMinistero_files/frecciamenu1.gif
/ministero/sezMinistero_files//frecciamenu1.gif
/ministero/sezMinistero_files/frecciamenu1
/ministero/sezMinistero_files/frecciamenu1.gif?var=1
/ministero/sezMinistero_files/frecciamenu1?var=1&pinco=ciao
../sezMinistero.img/frecciamenu1?var=1&pinco=ciao

Dovrebbe estrarre l'estensione (dove c'e`) oppure la stringa vuota

Ho provato:
/\.([^\?]*)/ # estrae dal primo . al ? (se presente)
/[\/\\]*.+\.([^\?]*)/ # estrae sempre dal primo .

Grazie a tutti.
Ciao
Michele

Kintaro
10-12-2003, 15:46
prova un po'..
non ho fatto altre prove a parte gli esempi, quindi... boh

@path= (
'/ministero/sezMinistero_files/frecciamenu1.gif',
'../sezMinistero_files/frecciamenu1.gif',
'/ministero/sezMinistero_files//frecciamenu1.gif',
'/ministero/sezMinistero_files/frecciamenu1',
'/ministero/sezMinistero_files/frecciamenu1.gif?var=1',
'/ministero/sezMinistero_files/frecciamenu1?var=1&pinco=ciao',
'../sezMinistero.img/frecciamenu1?var=1&pinco=ciao'
);

foreach (@path) {
/\.(\w{3,4})\z|\.(\w{3,4})\?/;
print "--> $+\n";
}

Mich_
10-12-2003, 17:12
Grazie Kintaro.

Ho apportato delle modifiche (sul campo ho trovato che underscore era uno dei limitatori), ma la struttura e` quella giusta:


/\.(\w{3,7})$|\.(\w{3,7})\?|\.(\w{3,7}?)\_/;



Una sola cosa non mi piace il dare limiti numerici alle estensioni (ci sono estensioni lunghe, ed anche estensioni piu` corte).

Forse questa e` quella definitva?


/\.([^\?\_]*)$|\.([^\?\_]*)[\?\_]/;


L'ho sperimentata, e sui dati che ho ora sembra funzionare

Ciao e ancora grazie.
Michele

Kintaro
10-12-2003, 21:22
a naso l'ultima sballa se c'è più di un punto nel nome del file, mi pare strano funzioni anche con questo: '../sezMinistero.img/frecciamenu1?var=1&pinco=ciao'

non ho provato però..

hai ragione, esisto estensioni da 1 (.c) da 2 (.pl) da 3 e 4, ma non me ne vengono in mente da 5 in su :confused:

l'underscore non necessita di backslash


:ciauz:

Mich_
11-12-2003, 09:47
Hai ragione, se ci sono altri punti non funziona. Ho provato ora.
Tornero` indietro ai tuoi consigli. Grazie comunque dell'aiuto.


Per quanto riguarda le estensioni.

E` un concetto che nasce dal CP/M, e` stato sviluppato dai SO della Digital, poi e` stato ripreso e reso obbligatorio dal MS-DOS, e mantenuto in Windows.

All'inizio erano tre caratteri alfabetici obbligatori (2 byte nei sistemi CP/M, tre nei vari DOS), poi non ci sono state limitazioni.

Nei sistemi unix (come pure nei mac), l'estensione era (ed e` tuttora) semplicemente un'aggiunta di un punto e di altri caratteri nel nome: una specie di mnemonico per ricordare cosa contiene un file, tanto e` vero che si posso usare estensioni a piacere.
Ad esempio nei fogli di lavoro di linux, l'estensione standard e` .gnumeric (8 caratteri)

Nei sistemi windows l'estensione e` l'elemento che dice al SO con che applicativo aprire un file, per cui e` obbligatoria, mentre nei mac ad ogni file e` associato un record nel filesystem (in pratica un altro file in una sottodir nascosta) che definisce tutta una serie di caratteristiche del file, tra cui il programma con cui va aperto.

Ciao
Michele

Mich_
11-12-2003, 12:41
Ultima prova:

/\.([^\?_\/\.]+)$|\.([^\?_\/\.]+)[\?_]/;
(ho trovato file con estensione doppia: prende solo l'ultima).

Ciao
Michele

Loading