Ошибка анализа: синтаксическая ошибка, непредвиденная строка T_FUNCTION 10?

Что не так с моим кодом? Я запускал код на своем тестовом сервере, и код работал, но когда я загружаю его на свой производственный сервер, я получаю

Parse error: syntax error, unexpected T_FUNCTION in /hermes/bosweb/web013/b130/ipg.acrsflcom/darayngedbeats/gentest.php on line 10 

вот мой код

 $old = "http://darayngedbeats1.s3.amazonaws.com /mp3/CrazyMonsta2.mp3?AWSAccessKeyId=AKIAJXA36ESCLQHCB54Q&Expires=1297279906& Signature=HD36ZQE8yeTIW6JPWKMcciPTiTs%3D"; //enter the key that needs to be converted $search = array(":","?","=","&","%"); $replace = array("%3A","%3F","%3D","%26","%25"); function search_replace($s,$r,$sql) { $e = '/('.implode('|',array_map('preg_quote', $s)).')/'; $r = array_combine($s,$r); return preg_replace_callback($e, function($v) use ($s,$r) { return $r[$v[1]]; },$sql); } echo "<br><br>"; $new = search_replace($search,$replace,$old); echo $new; ?> 

Ошибка, скорее всего, вызвана

 return preg_replace_callback($e, function($v) use ($s,$r) { return $r[$v[1]]; },$sql); 

Скорее всего, вы используете PHP 5.2 или ранее, что не поддерживает закрытие. Вы можете узнать, какую версию PHP вы используете phpinfo() .

Вероятно, вам нужно либо перейти на PHP 5.3+, либо использовать create_function , либо написать статическую функцию и передать ее в качестве обратного вызова .

Вот пример последней опции, используя простой класс для хранения состояния $r :

 class My_callback { public function __construct($s, $r) { $this->s = $s; $this->r = $r; } function callback($v) { return $this->r[$v[1]]; } } function search_replace($s,$r,$sql) { $e = '/('.implode('|',array_map('preg_quote', $s)).')/'; $r = array_combine($s,$r); $c = new My_callback($s, $r); return preg_replace_callback($e, array($c, 'callback'), $sql); } 

Для тех, кто получает эту ошибку на PHP 5.3+ и особенно с темой wordpress, я бы рекомендовал взглянуть на форматирование фактических файлов на сервере.

Когда я столкнулся с этой ошибкой и просмотрел файлы PHP, выкидывающие ошибку на сервере, у них не было разрывов строк и они были эффективно минимизированы до одной строки.

По какой-то причине Filezilla удалил разрывы строк, когда я загрузил файлы, и именно это и вызывало эту ошибку.

Изменив тип передачи в Filezilla на двоичный (Transfer> Transfer Type> Binary) и повторно загрузив тему wordpress, это устранило мою проблему!

Я надеюсь, что это помогает кому-то!

попробуйте извлечь вашу функцию обратного вызова в отдельную именованную функцию и ссылаться на нее по имени.

Я думаю, что вы ищете create_function: http://php.net/manual/en/function.create-function.php

create_function поддерживается как в php4, так и в php5

К настоящему моменту этот вопрос в основном устарел, потому что 5.3 существует уже давно, но помимо точек, поднятых другими ответами, я хотел бы указать, что то, что вы пытаетесь сделать, уже может быть выполнено с помощью strtr() :

 $new = strtr($old, array( ':' => '%3A', '?' => '%3F', '=' => '%3D', '&' => '%26', '%' => '%25', ));