2017-01-26 8 views
1

私はこのような何かを達成したい:その後、コンテンツに進み関数に取られするpreg_matchでスイッチケース(+/strposで始まる)

!say some message 

を。ご想像のとおり、私はいくつかのテキスト入力を聞いています。今私はこのような文字列でもcaseを誘発するという、問題に直面している:

this is !say some text 

コード:

$prefix = "!"; 
switch ($message->content) { 
    case preg_match("/[^.*]$prefix . 'say' (.*) /", $message->content): 
    _say($message); 
    break; 
} 

function _say($message) 
{ 
    $parts = explode("!say", $message->content); 
    return $message->channel->sendMessage(trim($parts[1]), true); 
} 

を私の理解から、正規表現は(もregexp-testerに確認された正しいです)。

substrでもテストされていますが、どちらでもありません。

case substr($message->content, 0, 3) == $prefix . 'say' : 

私は間違っていますか?

+0

質問は、関数呼び出しの出力をテストしましたか? '$ message-> content'がデフォルトで正しいと仮定しています。デバッグはプログラミングの鍵です。 – Xorifelse

+0

まあ、それは正しい部分なので、 '!say'の後ろのすべてが、文字列の位置に関係なく – DasSaffe

+0

' substr($ message-> content、0、3)== $ prefixを使うべきでしょう。 preg_match()の代わりに 'say''を使います。これはおそらく、より長いコマンドのために 'switch'ステートメントが変更されるべきであることを意味します。しかし...あなたは '{space} 'の最初の' strpos() 'の部分文字列を – Xorifelse

答えて

1

コマンドはコマンドであり、周囲をだましてはいけません。したがって、正規表現を使用する代わりに、単純な文字列の比較をお勧めします。

$prefix = "!"; 

function _say($message){ 
    return $message->channel->sendMessage(trim($message), true); 
} 


if($message->content[0] == $prefix){ 
    if($p = strpos($message->content, ' ') !== false){ 
    $cmd = substr($message->content, 1, $p); 

    switch($cmd){ 
     case 'say': 
     _say(substr($message->content, $p)); 
     break; 
     default: 
     die('unknown command'); 
    } 

    } else { 
    die('empty cmd'); 
    } 
} else { 
    die('no command'); 
} 
関連する問題