PHP中eregi()的良好替代品

时间:2009-04-10 09:56:56

标签: php string

我经常发现自己正在做这样的快速检查:

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

但是由于PHP {5.3}中不推荐使用eregi(),因此代码现在会抛出错误。

是否有其他功能的行为与eregi()完全相同?我对regexp一无所知,也不想学习,所以preg_match()等对我不起作用。

8 个答案:

答案 0 :(得分:24)

stristr获得与eregi完全相同的结果(至少在您不使用正则表达式时):

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

你也可以这样做一个“假的”eregi:

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

更新:请注意,stristr不接受eregi的正则表达式,对于此特定情况(检查扩展名),您最好使用vartec的解决方案。

答案 1 :(得分:19)

当然你知道,这不符合你的期望吗? 在正则表达式'。'表示任何字符,因此eregi('.php',$fileName)表示带有任何字符后跟'php'的文件名。因此,例如“blabla2PHP.txt”将匹配您的正则表达式。

现在你要做的是:

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

答案 2 :(得分:5)

使用 eregi() 修饰符preg_match() i的替代方案:

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

答案 3 :(得分:4)

试试这个,自从我最近更新到PHP 5以后,我已经使用了很多。

此前:

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

现在我正在使用它 - 它的效果一样好。

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

只需用以下代码替换您的代码,您的代码中不应该有任何差异。如果你想知道PHP删除eregi()的原因是因为它在使用时遇到了很多性能问题,所以最好使用preg_match(),因为它在搜索时更具体,因此它具有更好的性能和渲染时间。

让我知道这对你有用。

答案 4 :(得分:2)

如果你选择“假”eregi,你会在假函数内触发通知: trigger_error('某些代码仍使用eregi',E_USER_NOTICE); 通过这种方式,您可以轻松捕获被遗忘的eregi电话,并可以替换它们。

答案 5 :(得分:2)

也许你应该考虑重构你的代码来代替:

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

正如在这个问题的其他答案中所述,eregi('.php')将在文件中搜索“php”ANYWERE后面的任何内容(不仅仅是在结尾处)。

答案 6 :(得分:1)

我通常创建和结束功能;或其他简单的字符串操作函数。

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

答案 7 :(得分:0)

if(!stristr($ fileName,'。php'))       $文件名= '的php。';

moff的回答者有倒退的参数。

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