Ошибка синтаксического анализа: синтаксическая ошибка, неожиданная строка функции T 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;

?>

5 ответов


ошибка, вероятно, вызвана

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 на Binary (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',
));