2009-04-10 1 views
12

Ich finde ich oft schnelle Kontrolle wie dies zu tun:Gute Alternative zu eregi() in PHP

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

Aber als eregi() veraltet wurde in PHP 5.3 der Code jetzt wirft Fehler.

Gibt es eine andere Funktion, die sich genauso verhält wie eregi()? Ich weiß nichts über Regexps und möchte nicht lernen, also funktioniert preg_match() usw. nicht für mich.

+1

Ich hoffe, Sie erkennen, dass 'eregi()' ist ein regulärer Ausdruck Funktion. POSIX-Stil. 'preg_match()' ist eine reguläre Ausdrucksfunktion, Perl-Stil. – matpie

+0

Vielleicht finden Sie [ 's ($ str) -> endsWith ('.php')'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php#L117) und alle anderen String-Funktionen hilfreich, wie in [diese eigenständige Bibliothek] (https://github.com/delight-im/PHP-Str) gefunden. – caw

Antwort

22

stristr erreicht genau das gleiche Ergebnis wie eregi (zumindest wenn Sie reguläre Ausdrücke nicht wichtig):

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

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

Sie auch ein "fake" eregi auf diese Weise machen könnte

Update: Beachten Sie, dass stristr keine regulären Ausdrücke akzeptiert, wie eregi tut, und für diesen speziellen Fall (Überprüfung der Erweiterung), gehen Sie besser mit der Lösung von vartec .

+0

nur pingelig zu sein: stristr ist Groß- und Kleinschreibung, wenn Sie den Fall empfindlichen ay Verwendung strstr brauchen – Strae

+1

Nun, eregi ist Groß- und Kleinschreibung, auch :) – moff

+0

Was ist, wenn $ filename php im Namen hat, aber es ist nicht die Erweiterung? "example.php.txt" stristr funktioniert dafür nicht. – matpie

19

Sie wissen natürlich, dass dies nicht das tut, was Sie erwarten? In regexp '.' bedeutet ein beliebiges Zeichen, also eregi('.php',$fileName) bedeutet Dateiname mit einem beliebigen Zeichen, gefolgt von 'php'. So passt zum Beispiel "blabla2PHP.txt" zu Ihrer Regexp.

Nun, was Sie tun möchten, ist dies:

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

Guter Punkt, aber das war nicht meine Frage. Ich benutze den Dateinamen nur als Beispiel, was ich wirklich will, ist eine alternative Funktion zu eregi(), die wahr zurückgibt, wenn ein String a in String b gefunden wird, ansonsten –

2

Wenn Sie die „fake“ eregi gehen, shold Sie eine Mitteilung in der falschen Funktion auslösen: trigger_error (‚Einige Code noch eregi verwenden‘ , E_USER_NOTICE); Auf diese Weise werden Sie die vergessenen Eregi-Anrufe leicht abfangen und ersetzen können.

2

Vielleicht sollten Sie überlegen, Ihren Code Refactoring diese stattdessen zu tun:

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

Wie auf diese Frage in anderen Antworten erwähnt, eregi('.php') für irgendetwas von ‚php‘ anywere in der Datei (nicht nur gefolgt suchen bei das Ende).

1

Ich generiere im Allgemeinen und endet mit der Funktion; oder andere einfache Stringmanipulationsfunktionen für diese Art von Sachen.

4

Versuchen Sie dies, ich benutze dies ziemlich viel, seit ich vor kurzem PHP 5 aktualisiert.

Bisher:

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

Nun ist diese verwende ich - es funktioniert genauso gut.

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

Ersetzen Sie einfach Ihren Code durch den folgenden, und Sie sollten keinen Haken an Differenz innerhalb Ihres Codes haben. Wenn Sie sich wundern, warum PHP eregi() entfernt, liegt das an den Performanceproblemen, die es hat, wenn es oft verwendet wird. Deshalb ist es besser preg_match() zu verwenden, da es eine bessere Performance und Renderzeiten hat.

Lassen Sie mich wissen, wie das für Sie arbeitet.

5

gute Alternative für eregi() ist preg_match() mit i Modifikator:

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