php: Почему preg_replace_callback не позволяет использовать встроенные функции php, а только анонимные пользовательские функции?

Это не работает и выводит пустую строку:

$check["pattern"] = "correct";
$text = "Could this be correct?";
echo preg_replace_callback($check["pattern"],ucfirst,$text);

Было бы неплохо использовать встроенные функции. На самом деле общие обратные вызовы позволяют использовать встроенные функции в соответствии с http://php.net/manual/en/language.types.callable.php, но не preg_replace_callback. Может быть запрос функции для php?


person giorgio79    schedule 13.09.2012    source источник
comment
Я уверен, что вы слышали о strpos, но я просто рассказываю об этом...   -  person Oliver Tappin    schedule 13.09.2012
comment
Это тоже не работает, когда вы ставите ucfirst в кавычки? (Поскольку это строка...)   -  person Louis Huppenbauer    schedule 13.09.2012
comment
Да, спасибо, это просто фиктивный пример. Я использую для этого правильное регулярное выражение в реальной жизни: P   -  person giorgio79    schedule 13.09.2012


Ответы (2)


Ваш код должен вызвать уведомление и предупреждение:

  • Примечание. Использование неопределенной константы ucfirst — предполагается, что «ucfirst»
  • Предупреждение: preg_replace_callback(): разделитель не должен быть буквенно-цифровым или символом обратной косой черты.

Если это не так, вам серьезно нужно проверить настройки отчетов об ошибках PHP. Исправление кода с помощью сообщений об ошибках:

$check["pattern"] = "/correct/";
$text = "Could this be correct?";
echo preg_replace_callback($check["pattern"],'ucfirst',$text);

... мы получаем это:

Предупреждение: ucfirst() ожидает, что параметр 1 будет строкой, задан массив

Таким образом, использование встроенной функции обратного вызова работает нормально. Однако, как объясняется на странице руководства для ucfirst(), функция ожидает string, а не массив. И, как поясняется на странице руководства для preg_replace_callback():

Обратный вызов, который будет вызываться и передавать массив совпадающих элементов в строке темы.

Подводя итог: это не разумный запрос функции, это ошибка в вашем коде ;-)

person Álvaro González    schedule 13.09.2012

Он просто отлично работает со всеми функциями. Проблема в том, что эти функции ожидают определенных параметров. ucfirst ожидает строки в качестве входных данных, но preg_replace_callback передает массив совпадений.

Итак... если у вас есть встроенная функция, сигнатура которой совместима с сигнатурой обратного вызова preg_replace, она работает. Но нет, не все встроенные функции имеют совместимую сигнатуру.

person deceze♦    schedule 13.09.2012
comment
Спасибо, еще одно хорошее объяснение. Альваро был первым, так что я надеюсь, что все в порядке, если я соглашусь с этим :) - person giorgio79; 13.09.2012