2015-12-13 11 views
5

Mi chiedo se c'è un'espressione regolare che posso utilizzare per trovare le estensioni di file utilizzando l'html di base.Espressione regolare per l'estensione del file

In questo momento ho

<img src="images/pimage/{$item['item_id']}/small.jpg"> 

Il problema non è tutte le mie immagini terminano in .jpg.

Quindi vorrei un expresion regolare che può trovare tutte le immagini che iniziano con piccoli e finire in .jpg, .jpeg, .JPG, .png, .gif, ecc ... sia in minuscolo e maiuscolo.

Esiste una regex semplice che posso inserire dopo "small" per trovare tutti i file corrispondenti?

Non sono sicuro di cosa sto facendo male, ma quando provo uno dei suggerimenti, l'output mostra solo la regex e non i risultati previsti. ecco il mio codice attuale

 function print_item($item,$link_change){ 
     $acticon= ($item['active']==TREEMAN_ITEM_ACTIVE)? 'active.gif' : 'disabled.gif'; 
     $tmpl_act=($this->section->webmode)? "<td><img src=\"".ADMIN_IMG_PATH."icons/{$acticon}\"></td>" : ""; 
     $tmpl_date=date('Y-m-d H:i',$item['cdate']); 
     $tmpl_added_by=$item['added_by']; 
     $tmpl_modified_by=$item['modified_by']; 
//  $tmpl_date_mod=date('Y-m-d H:i',$item['timestamp']); 
     $tmpl_date_mod=$item['timestamp']; 
     $res=<<<EOT 
<td >{$item['item_id']}</td> 
<td><a href="{$link_change}"</a><img src="/img/ucart/images/pimage/{$item['item_id']}/small.jpg" height="75" width="75"</td> 
<td class="tb" width="50%"><a href="{$link_change}" title="Edit item">{$item['item_name']}</a></td> 
<td>$tmpl_date</td> 
<td>$tmpl_date_mod</td> 
<td>$tmpl_added_by</td> 
<td>$tmpl_modified_by</td> 
$tmpl_act 
EOT; 

Qualche idea su cosa sto facendo male?

+1

Per chiarimenti, stai cercando di restituire il nome file 'small-filename.jpg' o una regex per ottenere il percorso completo del file, ad es. 'images/pimage/27/small-filename.jpg'? – femmestem

+0

Tutti i nomi dei file sono piccoli nomi. Alcuni sono small.jpg, alcuni small.JPG, small.png, small.gif, ecc ... – Robert

risposta

2

L'espressione regolare per catturare tutte le immagini che iniziano con "piccola" e fine a qualsiasi estensione che hai elencato:

/^small.*\.(jpe?g|gif|png|tiff)$/i

Termini spiegato:

^ - inizia con

.* - corrisponde a 0 o più di qualsiasi carattere

\. - corrisponde ad un periodo; \ è un carattere di escape che significa che il seguente carattere deve essere interpretato letteralmente, il che è necessario perché i caratteri ., ?, +, ecc. Hanno un significato in regex in caso contrario.

(a|b|c) - corrisponde a qualsiasi cosa contenuta all'interno delle parentesi (esempio, viene soddisfatta se il carattere successivo è a o b o c)

? - significa che il carattere precedente può apparire zero o una volta (ad esempio, jpe?g partite " jpeg" perché contiene una 'e', ​​e corrisponde anche 'jpg', perché la 'e' compare zero volte in quella posizione)

$ - denota fine del modello da abbinare

/your-regex-pattern/i - casi di partite insensibili (maiuscole e minuscole)

Se volete saperne di più su pattern matching nella espressione regolare, controlla questo maneggevole: http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

+0

Errore per qualsiasi file contenente un periodo diverso da quello precedente all'estensione (ad esempio, 'small.heart.png' non riuscirà anche se è un nome file valido). Inoltre, la fine dovrebbe essere '(jpg | jpeg | gif | png | tiff)' (usando parentesi, non parentesi). Infine, potresti essere prudente specificare '$' alla fine del pattern per assicurarti che non ci siano caratteri che seguono la presunta estensione del file (ad esempio, i tuoi pattern attuali avrebbero avuto successo per qualcosa del tipo: 'small.jpg.php' o qualsiasi altra cosa che segue un'estensione dell'immagine valida). – SpencerD

+0

@SpencerDoak Grazie per aver catturato il '[]' vs '()'. Per quanto riguarda i casi limite dei nomi dei file, sono completamente d'accordo con te, ma non ne ho tenuto conto perché OP ci ha dato un'idea di come sarebbero i nomi dei file. – femmestem

+3

Un'altra cosa, 'jpg | jpeg' potrebbe essere accorciata a' jpe? G' – Gary

0

Secondo this page from www.Regular-Expressions.info, maiuscole e minuscole e altri simili matching- le flag/opzioni sono solitamente implementate nel linguaggio di programmazione piuttosto che direttamente nel pattern stesso. Tuttavia, nel caso in cui la lingua non fornisca l'opzione per passare in matching-flags/options, la pagina di informazioni RegEx collegata sopra dice che opzioni come Insensibilità di Case possono essere specificate nel pattern.

Per specificare un motivo come non sensibile alla distinzione tra maiuscole e minuscole, è possibile specificare (?i) come inizio della parte non sensibile al maiuscolo e (?-i) come fine della parte non sensibile al maiuscolo/minuscolo.

Per la situazione specifica, ciò significa che il seguente modello RegEx potrebbe essere efficace: \.(?i)(png|gif|jpg|jpeg|ico|bmp|svg|tiff)(?-i)$ Ovviamente, si vorrebbe modificare questo modello in base alle proprie esigenze per aggiungere o rimuovere i tipi di file di immagine.

In questo modello: \. denota un carattere letterale (.); (?i) disattiva la distinzione tra maiuscole e minuscole per tutte le parti successive; (png|gif|jpg|jpeg|ico|bmp|svg|tiff) denota un elenco di opzioni, il che significa che l'estensione del file deve essere una (e una sola) delle opzioni nella lista; (?-i) attiva la distinzione tra maiuscole e minuscole; e $ segna la fine della stringa, il che significa che non possono esserci caratteri che seguono l'estensione del file.

Se la lingua che si sta utilizzando supporta la specifica della corrispondenza, contrassegna in un altro modo, quindi ti consigliamo di specificarli in qualsiasi modo la lingua lo raccomandi; tuttavia, in base alla pagina di informazioni RegEx che ho linkato sopra, questo è il modo corretto per specificarli all'interno del pattern (che ha il vantaggio di non rendere l'intero modello insensibile alla distinzione tra maiuscole e minuscole, se si decide di aggiungere altro al pattern) .

EDIT: come un avvertimento, sembra che Javascript non supporta girando maiuscole e minuscole e lo spegnimento all'interno del modello stesso (utilizzando (?i) e (?-i)). Quindi, se stai lavorando con Javascript, dovresti risolvere il problema impostando /i come bandiera alla fine della tua espressione o utilizzando uno schema come il seguente: \.([pP][nN][gG]|[jJ][pP][eE]?[gG]|[gG][iI][fF]|[iI][cC][oO]|[tT][iI][fF]{1,2})$. In questo modello, ogni lettera nell'estensione è specificata sia in maiuscolo che in minuscolo. Ciò consente al pattern di abbinare un'estensione di file indipendentemente dal caso in cui è stato scritto, pur consentendo al resto dell'espressione di distinguere tra maiuscole e minuscole.

1

Forse, questo ti sarà d'aiuto?

/\.\w+$/ 

(il segno punto e 1 (o più) caratteri di classe parola alla fine della stringa di input)

o

/\.[a-z]+$/i 
/\.[a-zA-Z]+$/ 

(il segno punto e 1 (o più) lettere alla fine della stringa di input)

o

/\.[a-z]{1,4}$/i 
/\.[a-zA-Z]{1,4}$/ 

(il segno punto e da 1 a 4 lettere alla fine della stringa di input)

Privacy, che tutte le opzioni ha un segno di punti in uscita.
Tutte le espressioni regolari non fanno distinzione tra maiuscole e minuscole poiché esiste un flag i.


Inoltre, purtroppo, JavaScript non supporta lookbehind, quindi regexp

/(?<=small\.)[a-z]+/i 

(1 o più lettere dopo small. stringa)

non funziona; ma, penso, sarebbe la migliore espressione regolare in questo caso.