Ну, это потому, что функция уже была определена в предыдущем вызове функции (это опасно при объявлении функции внутри другой функции). Есть несколько вариантов.
Условно объявив функцию
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);