2009-04-10 7 views
12

spesso mi ritrovo a fare controlli rapidi in questo modo:Buona alternativa a eregi() in PHP

if (!eregi('.php', $fileName)) { 
    $filename .= '.php'; 
} 

Ma, come eregi() è stato sconsigliato a PHP 5.3 del codice ora genera errori.

Esiste un'altra funzione che si comporta esattamente allo stesso modo di eregi()? Non so nulla di espressioni regolari e non voglio imparare, quindi preg_match() non funzionerà per me.

+1

Spero vi rendete conto che 'eregi()' è una funzione espressione regolare. POSIX-style. 'preg_match()' è una funzione di espressione regolare, in stile Perl. – matpie

+0

Potresti trovare ['s ($ str) -> endsWith ('.php')'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php#L117) e tutte le altre funzioni stringa utili, come trovate in [questa libreria standalone] (https://github.com/delight-im/PHP-Str). – caw

risposta

22

stristr raggiunge esattamente lo stesso risultato eregi (almeno quando non si utilizza le espressioni regolari):

if (!stristr($fileName, '.php')) 
    $filename.='.php'; 

Si potrebbe anche fare un eregi "falso" in questo modo:

if (!function_exists('eregi')) { 
    function eregi($find, $str) { 
     return stristr($str, $find); 
    } 
} 

Aggiornamento: Si noti che stristr non accetta le espressioni regolari come fa eregi e, in questo caso specifico (controllando l'estensione), è meglio andare con la soluzione di vartec .

+0

solo per essere pignoli: stristr non fa distinzione tra maiuscole e minuscole, se hai bisogno di maiuscole e minuscole usa lo strstr – Strae

+1

Beh, anche eregi non fa distinzione tra maiuscole e minuscole :) – moff

+0

Cosa succede se $ fileName ha php nel nome ma non è l'estensione? "example.php.txt" stristr non funzionerà per questo. – matpie

19

Ovviamente si è consapevoli che ciò non fa ciò che si aspetta che faccia? In regexp '.' significa qualsiasi carattere, quindi eregi('.php',$fileName) significa nomefile con qualsiasi carattere seguito da 'php'. Ad esempio, "blabla2PHP.txt" corrisponderà all'espressione regolare.

Ora ciò che si vuole fare è questo:

$file_ext = pathinfo($filename, PATHINFO_EXTENSION); 
if(strtolower($file_ext) != 'php') 
    $filename .= '.php'; 
+0

Un buon punto, ma questa non era la mia domanda. Ho usato il nome del file solo come esempio, quello che voglio veramente è una funzione alternativa a eregi() che restituisce true se una stringa a si trova nella stringa b, false altrimenti –

2

Se si va per l'eregi "falso", occorre seguire innescare un avviso all'interno della funzione falso: trigger_error ('Alcuni codice di usare ancora eregi' , E_USER_NOTICE); In questo modo potrai facilmente catturare le chiamate eregi dimenticate e sostituirle.

2

forse si dovrebbe prendere in considerazione il refactoring il codice per fare questo, invece:

if (substr($fileName, -4, 4) !== '.php') 
    $fileName .= '.php'; 

Come indicato in altre risposte a questa domanda, eregi('.php') cercherà nulla seguito da anywere 'php' nel file (non solo a fine).

1

Generalmente creo e termino con la funzione; o altre semplici funzioni di manipolazione delle stringhe per questo tipo di cose.

function endsWith($string, $end){ 
    return substr($string, -strlen($end)) == $end; 
} 
4

Prova questo, sto usando questo molto da quando ho aggiornato a PHP 5 di recente.

precedenza:

if(eregi('-', $_GET['id']) 
{ 
    return true; 
} 

ora sto usando questo - funziona altrettanto bene.

if(preg_match('/(.+)-(.+)/', $_GET['id'])) { 
{ 
    return true; 
} 

Basta sostituire il codice con il seguente, e non dovreste avere alcun intoppo della differenza all'interno del codice. Se ti stai chiedendo perché PHP rimuovi eregi() è a causa dei problemi di prestazioni che ha quando usato molto, quindi è meglio usare preg_match() perché è più specifico nella ricerca, quindi ha prestazioni e tempi di rendering migliori.

Fammi sapere come funziona per te.

0

if (! Stristr ($ fileName, '.php')) $ nomefile. = '. Php';

Il risponditore di moff aveva i parametri all'indietro.

http://php.net/manual/en/function.stristr.php

+0

sembra giusto per me - prima il pagliaio, poi l'ago. –

5

buona alternativa per eregi() è preg_match() con i modificatore:

if (! preg_match('/.php/i',$fileName)) 
     $filename.='.php';