PHP: функция в preg_replace говорит, что функция уже была объявлена - PullRequest
1 голос
/ 30 августа 2010

Функция:

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

Замена

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

Проблема:

Неустранимая ошибка: невозможно повторно объявить doSomething () (ранее объявленный в http://example.com/test.php:69) в http://example.com/test.php в строке 69

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

Ответы [ 3 ]

4 голосов
/ 30 августа 2010

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

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

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 голосов
/ 15 марта 2011

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

0 голосов
/ 30 августа 2010

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

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

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