Функция:
function doSomething($url){
$url = "{$url}";
return $url;
}
Замена
$content = preg_replace("#(http:\/\/+[^\s]+)#ie","doSomething('$1')", $content);
Проблема:
Неустранимая ошибка: невозможно повторно объявить doSomething () (ранее объявлено в http://example.com/test.php:69 ) в http://example.com/test.php в строке 69
Примечание: Текущая функция не представляет мою реальную функцию, я знаю, что для этой ситуации мне не нужны никакие функции, но мне нужен мой реальный код. Но это также лучший пример.
Ну, это потому, что функция уже была определена в предыдущем вызове функции (в этом заключается опасность объявления функции внутри другой функции). Есть несколько вариантов.
Условное объявление функции
if (!function_exists('doSomething')) {
function doSomething($url)...
}
Объявление анонимной функции:
PHP 5.3+:
$callback = function($url) {
//...
}
PHP 5.2+:
$callback = create_function('$url', '//...');
Использование класса:
class foo {
public function doReplace($string) {
$callback = array($this, 'doSomething');
// Do your matching here
}
public function doSomething($url) {
//...
}
}
Кроме того, я бы не советовал использовать e
модификатор для регулярного выражения (это просто не обязательно, и в основном просто eval
, что обычно рассматривается как зло). Вместо этого вы должны просто использовать preg_replace_callback
:
Предполагая, что $callback
является допустимым обратным вызовом:
$callback = function($match) {
$url = $match[1];
//... Do stuff here
}
$string = preg_replace_callback($regex, $callback, $string);
Ну... в сообщении об ошибке говорится о проблеме. У вас есть объявление функции doSomething()
несколько раз.
Просмотрите строку 69 файла test.php
и попробуйте прокомментировать объявление.