2009-04-10 17 views
12

a menudo me encuentro haciendo comprobaciones rápidas como esta:Una buena alternativa a eregi() en PHP

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

Pero como eregi() está desfasada y en PHP 5.3 el código ahora lanza errores.

¿Hay otra función que se comporte exactamente igual que eregi()? No sé nada sobre expresiones regulares y no quiero aprender, así que preg_match() etc. no funcionarán para mí.

+1

espero que te das cuenta de que 'eregi()' es una función de expresiones regulares. Estilo POSIX 'preg_match()' es una función de expresión regular, estilo Perl. – matpie

+0

Es posible encontrar [ 's ($ str) -> endsWith ('php')'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php#L117) y todas las otras funciones de cadena útiles, como se encuentran en [esta biblioteca independiente] (https://github.com/delight-im/PHP-Str). – caw

Respuesta

22

stristr logra exactamente el mismo resultado que eregi (al menos cuando no utiliza expresiones regulares):

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

También podría hacer una eregi "falso" de esta manera:

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

Actualización: Tenga en cuenta que stristr no acepta expresiones regulares como eregi, y para este caso específico (verificando la extensión), será mejor que vaya con la solución de vartec .

+0

solo para ser quisquilloso: stristr no distingue entre mayúsculas y minúsculas, si necesita mayúsculas y minúsculas, use strstr – Strae

+1

Bueno, eregi tampoco distingue entre mayúsculas y minúsculas :) – moff

+0

¿Qué pasa si $ fileName tiene php en el nombre pero no es la extensión? "example.php.txt" stristr no funcionará para esto. – matpie

19

Por supuesto, usted sabe que esto no hace lo que espera que haga. En regexp '.' significa cualquier carácter, por lo que eregi('.php',$fileName) significa nombre de archivo con cualquier carácter seguido de 'php'. Así, por ejemplo, "blabla2PHP.txt" coincidirá con su expresión regular.

Ahora lo que quiere hacer es la siguiente:

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

Buen punto, pero esta no era mi pregunta. utilicé el nombre del archivo solo como un ejemplo, lo que realmente quiero es una función alternativa a eregi() que devuelve verdadero si una cadena a se encuentra en la cadena b, de lo contrario –

2

Si usted va para el eregi "falso", que no debe dejar desencadenar un aviso dentro de la función falsa: trigger_error ('Parte del código todavía utilizan eregi' , E_USER_NOTICE); De esta manera, detectará fácilmente las llamadas eregi olvidadas y puede reemplazarlas.

2

quizás usted debe considerar refactorización su código para hacer esto en su lugar:

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

Como se ha dicho en otras respuestas a esta pregunta, eregi('.php') va a buscar cualquier cosa seguido por dondequiera con 'php' en el archivo (no sólo en el el fin).

1

Generalmente creo y terminoCon la función; u otras funciones simples de manipulación de cadenas para este tipo de cosas.

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

Pruebe esto, estoy usando esto bastante desde que actualicé a PHP 5 recientemente.

Anteriormente:

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

Ahora estoy usando esto - que funciona igual de bien.

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

Simplemente reemplace su código con lo siguiente, y no debería haber ninguna diferencia dentro de su código. Si se pregunta por qué PHP elimina eregi() es debido a los problemas de rendimiento que tiene cuando se usa mucho, por lo que es mejor usar preg_match() ya que es más específico en la búsqueda para que tenga un mejor rendimiento y tiempos de renderización.

Dejarme saber cómo funciona esto para usted.

5

buena alternativa para eregi() es preg_match() con i modificador:

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