Хорошая альтернатива eregi () в PHP - PullRequest
12 голосов
/ 10 апреля 2009

Я часто провожу быстрые проверки вроде этого:

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

Но так как eregi() устарел в PHP 5.3, код теперь выдает ошибки.

Есть ли другая функция, которая ведет себя точно так же, как eregi()? Я ничего не знаю о регулярных выражениях и не хочу учиться, поэтому preg_match() и т. Д. Не сработают для меня.

Ответы [ 8 ]

24 голосов
/ 10 апреля 2009

stristr достигает того же результата, что и eregi (по крайней мере, если вы не используете регулярные выражения):

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

Вы также можете сделать "фальшивый" eregi следующим образом:

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

Обновление : обратите внимание, что stristr не принимает регулярные выражения, как eregi, и для этого конкретного случая (проверка расширения) лучше использовать решение vartec.

19 голосов
/ 10 апреля 2009

Конечно, вы знаете, что это не то, что вы ожидаете? В регулярном выражении "." означает любой символ, поэтому eregi('.php',$fileName) означает имя файла с любым символом, за которым следует 'php'. Так, например, «blabla2PHP.txt» будет соответствовать вашему регулярному выражению.

Теперь, что вы хотите сделать, это:

$file_ext = pathinfo($filename, PATHINFO_EXTENSION);
if(strtolower($file_ext) != 'php') 
   $filename .= '.php';
5 голосов
/ 16 апреля 2012

Хорошая альтернатива для eregi() - это preg_match() с i модификатором:

if (! preg_match('/.php/i',$fileName))
      $filename.='.php';
4 голосов
/ 14 августа 2010

Попробуйте, я использую это довольно часто, так как я недавно обновился до PHP 5.

Ранее:

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

Теперь я использую это - оно работает так же хорошо.

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

Просто замените ваш код следующим, и у вас не должно быть различий в вашем коде. Если вам интересно, почему PHP удаляет eregi (), то это из-за проблем с производительностью, которые возникают при частом использовании, поэтому лучше использовать preg_match (), так как он более специфичен при поиске, поэтому он имеет лучшую производительность и время рендеринга.

Дайте мне знать, как это работает для вас.

2 голосов
/ 10 апреля 2009

Возможно, вам следует рассмотреть возможность рефакторинга вашего кода, чтобы сделать это вместо:

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

Как указывалось в других ответах на этот вопрос, eregi('.php') будет искать в файле что-либо, за которым следует 'php' (не только в конце).

2 голосов
/ 10 апреля 2009

Если вы выбираете «поддельный» eregi, вы должны вызвать уведомление внутри функции поддельного: trigger_error ('Некоторый код все еще использует eregi', E_USER_NOTICE); Таким образом, вы легко поймете забытые вызовы eregi и сможете их заменить.

1 голос
/ 11 апреля 2009

я вообще создаю и заканчивается функцией; или другие простые функции для работы со строками для такого рода вещей.

function endsWith($string, $end){
    return substr($string, -strlen($end)) == $end;
}
0 голосов
/ 27 января 2012

if (! Stristr ($ fileName, '.php')) $ Имя_файла = 'PHP.';.

ответчик моффа имел параметры в обратном направлении.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...