1

PHP 5.2の2行目と13行目にエラーがあります。修正する必要がありません。create_functionを使用してみましたが、機能しません。誰かがこれを手伝ってくれますか?

function _process_special_keyword($str){
   $callback = function($match){
     $ret = $match[1] . '[' . $match[2] . ']';
     if(!empty($match[3])){
       $ret .= '.[' . $match[3] . ']';
     } 
     $ret .= $match[4];
     return $ret;           
   };

   $strSQL = preg_replace_callback('/([\s\(\.,])(' . SPECIAL_KEYWORDS . ')(?:\.(' . SPECIAL_KEYWORDS . '))?([\s\)\.,])/i', $callback, $str);

   $callback = function($match){
     return 'CASE WHEN ' . $match[1] . ' THEN ' . $match[2] . ' ELSE ' . $match[3] . ' END';
   };

   $strSQL = preg_replace_callback('/if\s*\((.+),(.+),(.+)\)/i', $callback, $strSQL);
   return $strSQL;
}

ありがとう。

エラー:解析エラー:構文エラー、予期しないT_FUNCTION

4

3 に答える 3

4

を使用する場合、最初の引数の内容は、宣言create_function()の括弧を埋めるPHPコードの文字列表現である必要があります。function2番目の引数には、関数宣言の中括弧内のコードのみを含める必要があります{}。実際の宣言自体は省略してください。

このコードを試してください:

function _process_special_keyword($str){

   $callback = create_function(
     '$match',
     '
       $ret = $match[1] . "[" . $match[2] . "]";
       if(!empty($match[3])){
         $ret .= ".[" . $match[3] . "]";
       } 
       $ret .= $match[4];
       return $ret;
     '
   );

   $strSQL = preg_replace_callback('/([\s\(\.,])(' . SPECIAL_KEYWORDS . ')(?:\.(' . SPECIAL_KEYWORDS . '))?([\s\)\.,])/i', $callback, $str);

   $callback = create_function(
     '$match',
     'return "CASE WHEN " . $match[1] . " THEN " . $match[2] . " ELSE " . $match[3] . " END";'
   );

   $strSQL = preg_replace_callback('/if\s*\((.+),(.+),(.+)\)/i', $callback, $strSQL);
   return $strSQL;
}
于 2012-04-05T15:14:18.423 に答える
3

この関数の外部でコールバックを宣言できます。このような:

function _callback_one($match){
  $ret = $match[1] . '[' . $match[2] . ']';
  if(!empty($match[3])){
    $ret .= '.[' . $match[3] . ']';
  } 
  $ret .= $match[4];
  return $ret;           
}

function _callback_two($match){
  return 'CASE WHEN ' . $match[1] . ' THEN ' . $match[2] . ' ELSE ' . $match[3] . ' END';
}

function _process_special_keyword($str){
   $strSQL = preg_replace_callback('/([\s\(\.,])(' . SPECIAL_KEYWORDS . ')(?:\.(' . SPECIAL_KEYWORDS . '))?([\s\)\.,])/i', '_callback_one', $str);

   $strSQL = preg_replace_callback('/if\s*\((.+),(.+),(.+)\)/i', '_callback_two', $strSQL);
   return $strSQL;
}

注:これらの関数がクラス内にある場合(つまり、関数をのように呼び出す必要がある場合$this->_callback_one)、「コールバック」パラメーターとして配列を渡します。

function _process_special_keyword($str){
   $strSQL = preg_replace_callback('/([\s\(\.,])(' . SPECIAL_KEYWORDS . ')(?:\.(' . SPECIAL_KEYWORDS . '))?([\s\)\.,])/i', array($this, '_callback_one'), $str);

   $strSQL = preg_replace_callback('/if\s*\((.+),(.+),(.+)\)/i', array($this, '_callback_two'), $strSQL);
   return $strSQL;
}
于 2012-04-05T15:15:09.753 に答える
0

オブジェクトの質問によると、私が考えるより速い方法はそういうものです、

$f = <<<myfunc
 \$ret = \$match[1] . '[' . \$match[2] . ']';
 if(!empty(\$match[3])){
   \$ret .= '.[' . \$match[3] . ']';
 } 
 \$ret .= \$match[4];
 return \$ret;           
myfunc;

$callback = create_function('$match',$f);

$および<<<FLAGFLAGの前のバックスラッシュに注意してください。構築します。実際には、ロケットの答えはもっと簡単です。

于 2012-04-05T15:26:04.490 に答える