2010-08-30 3 views
1

Функция:PHP: Функция в preg_replace говорит, что функция уже была объявлена ​​

function doSomething($url){ 
    $url = "<a href=\"{$url}\" target=\"blank\" title=\"{$url}\">{$url}</a>"; 
    return $url; 
} 

Замена

$content = preg_replace("#(http:\/\/+[^\s]+)#ie","doSomething('$1')", $content); 

Проблема:

Fatal error: Cannot redeclare doSomething() (previously declared in http://example.com/test.php:69) in http://example.com/test.php on line 69

Примечание: Текущая функция не представляет мою действительную функцию, я знаю, что для этой ситуации мне не нужны никакие функции, но в моем реальном коде мне нужно. Но это также лучший пример.

+0

Нужно ли вам приложить свою функцию в кавычки? – shady

+0

Да @shady, потому что я внутри 'preg_replce', и я использую модификатор' e' в шаблоне. :) – Adam

ответ

4

Ну, это потому, что функция уже была определена в предыдущем вызове функции (это опасность при объявлении функции внутри другой функции). Есть несколько вариантов.

условно объявить функцию

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); 
+0

@ircmaxell Привет! Большое спасибо за ваш ответ! Я думаю, это поможет мне. – Adam

+0

У меня PHP 5.3, но я получаю эту ошибку 'Catchable fatal error: Object of class Closure не удалось преобразовать в строку в example.com/test.php в строке 83' Также у меня есть Dreamweaver CS5, что подчеркивает анонимную функцию как инвалид. Я прочитал это http://www.php.net/manual/en/functions.anonymous.php, и я сделал это, как он пишет, но я не знаю, в чем проблема: S – Adam

+0

Как я уже сказал, t используйте модификатор 'e' и передайте обратный вызов как varaible в' preg_replace_callback': '$ string = preg_replace_callback ($ regex, $ callback, $ string);' где '$ callback' является анонимной функцией напрямую. Не нужно ничего прикладывать к объектам ... И я бы предложил получить достойную среду IDE для написания PHP (Dreamweaver не является средой разработки) ... – ircmaxell

-2

Ну ... сообщение об ошибке говорит о проблеме. У вас есть объявление для функции doSomething() несколько раз.

Проверьте строку 69 из test.php и попробуйте прокомментировать объявление.

+0

@Otar Я не использую более одного раза 'doSomething()'. Я думаю, проблема связана с модификатором 'e', который позволяет' preg_replace' использовать функцию несколько раз, но я не знаю, как ее исправить. – Adam

+2

проблема явно не в том, что 'doSomething()' объявляется более одного раза, поскольку сообщение об ошибке говорит, что оно объявлено дважды в одной строке, то есть строка с 'preg_replace()' – Frxstrem

+0

@Frxstrem: откуда вы знаете ошибка находится в той же строке, что и preg_replace()? –

0

Как говорится, йоЗотеЬЫпд уже определен. Использовать doSomething2 :)

Смежные вопросы