Autor Zpráva
Fisak
Profil
Dobrý den. Dělám chat a rád bych si udělal nějakou sadu příkazů v chatu.. Např. když napíšu do chatu "/kick Fisak" tak aby se vykonal nějaký skrypt. Mohl by mi poradit prosím někdo jak toto udělat ? Něco jako:

 
if($_POST["text"] == "/kick $nick") DB::query("DELETE FROM [:pref:chat] where nick = $nick");
Alphard
Profil
Regulární výrazy.
Fisak
Profil
ok zhruba jsem něco vytvořil ale nefunguje mi to ..
if($_POST['text'] == preg_match('@^(?:/kick)?([^/]+)@i', $_POST['text'], $matches)) DB::query("DELETE FROM [:pref:chat] where nick = $matches[1]");
DJ Miky
Profil
Nebo, pokud jsou ty příkazy syntakticky jednoduché, bude fungovat porovnání začátku řetězce na '/kick ' a další zpracování pomocí funkcí pro práci s řetězci.

Případně zadaný text rozseknout na dvě části pomocí list($prikaz, $parametr) = explode(' ', $text, 2); a první část ($prikaz) porovnat v nějakém switchi na '/kick' a další speciální příkazy.


@^(?:/kick)?([^/]+)@i
To mi moc nedává smysl, jednodušší RV by byl:
@^/kick (.+)$@i
A možná by bylo vhodné $matches[1] ještě prohnat přes trim(), aby se eliminovaly případné mezery navíc zadané omylem.
Tori
Profil
Fisak:
- preg_match vrací logickou hodnotu, ne řetězec.
- chybí vám uvozovky/apostrofy okolo nicku v SQL dotazu
- před vložením nicku do SQL z něj ořežte mezery a escapujte ho, jinak je funkčnost nejistá

Máte povolené mezery v přezdívkách uživatelů? Pokud ne, tak by regulár měl vypadat spíš takhle: '@^(?:/kick)?\s+?([^/\s]+)@i' Pokud ano, tak by to chtělo změnit syntax toho příkazu, např. /kick "prezdivka s mezerou" nějaký další text
Str4wberry
Profil
Případně by místo switche ty příkazy mohly být jednotlivé funkce:
function prikaz_kick($nick) {
  DB::query("DELETE FROM [:pref:chat] where nick = $nick");
}
S tím, že pokud by se jednalo o příkaz (řetězec začíná lomítkem), by se ověřila existence dané funkce a v případě úspěchu se rovnou zavolala.
ShiraNai7
Profil
Trošku jsem se do toho zažral, snad se v tom vyznáš :)


Funkce pro získání příkazu.
Vrací pole s názvem příkazu a parametry nebo false, když se nejedná o příkaz.
Podporuje více parametrů a můžou být nepovinně v uvozovkách.

function parseCommand($command)
{
    if (1 === preg_match('~^/([a-z]+)(?: (.*))?$~', strval($command), $matches)) {
        $command = $matches[1];
        $params = array();
        if (isset($matches[2])) {
            preg_match_all('~"([^"]+)?"|([^\\s]+)~', $matches[2], $matches, PREG_SET_ORDER);
            for ($i = 0; isset($matches[$i]); ++$i) {
                if (isset($matches[$i][2])) {
                    $params[] = $matches[$i][2];
                } else {
                    $params[] = $matches[$i][1];
                }
            }
        }
        return array($command, $params);
    } else {
        return false;
    }
}

Ukázkové použití s funkcemi:

function prikaz_kick($nick = '')
{
    // ESCAPOVAT PRO POUZITI V DOTAZU! (napr mysql_real_escape_string($nick))
    DB::query('DELETE FROM [:pref:chat] where nick = "' . $nick . '"');
}

function prikaz_test()
{
    echo "test: ";
    var_dump(func_get_args());
}

if (isset($_POST['text'])) {

    // vyparsovat prikaz
    $prikaz = parseCommand($_POST['text']);
    if (false !== $prikaz) {
    
        // zaslany text je prikaz
        list($prikaz, $parametry) = $prikaz;
        
        // test funkce
        $funkce = 'prikaz_' . $prikaz;
        if (function_exists($funkce)) {
            call_user_func_array($funkce, $parametry);
        }
        
    } else {
    
        // nejedna se o prikaz
        
    }

Ukázkové použití s $_POST['text'] a switchem.

if (isset($_POST['text'])) {

    // vyparsovat prikaz
    $prikaz = parseCommand($_POST['text']);
    if (false !== $prikaz) {
    
        // zaslany text je prikaz
        list($prikaz, $parametry) = $prikaz;
        
        // definovat vyzadovany pocet parametru pro jednotlive prikazy
        // nazev prikazu => pocet parametru
        $minParametru = array(
            'kick' => 1,
            'test' => 0,
        );
        
        // zpracovat prikaz
        if (isset($minParametru[$prikaz])) {
            if (sizeof($parametry) >= $minParametru[$prikaz]) {
                switch ($prikaz) {
                
                    // kick
                    case 'kick':
                        $nick = $parametry[1]; // ESCAPOVAT PRO POUZITI V DOTAZU! (napr mysql_real_escape_string($nick))
                        DB::query('DELETE FROM [:pref:chat] where nick = "' . $nick . '"');
                        break;
                        
                    // test
                    case 'test':
                        echo "prikaz = {$prikaz}, parametry = ";
                        var_dump($parametry);
                        break;
                
                }
            } else {
                // nedostatek parametru
                echo "Pro /{$prikaz} je vyzadovano alespon {$minParametru[$prikaz]} parametru!";
            }
        } else {
            // neznamy prikaz
            echo "Neznamy prikaz!";
        }
        
    } else {
    
        // nejedna se o prikaz
        
    }
}
Fisak
Profil
Děkuji moc :-) moc mi toto pomohlo..


ještě dotaz ... když bych chtěl z toho dle zjistit preg_match('@^(?:/kick)?\s+?([^/\s]+)@i', "/kick nick text", $mch); tak jak zjistim ten "text"??


Dobře takže mám problém...
//podmínky chatu (administrace)
   if(preg_match('~^/([a-z]+)?\s+?([^/\s]+)(?: (.*))?$~', $_POST["text"], $matches)) {                        
  
   //vyčištění chatu
  if($matches[1] == "trash") { DB::query("DELETE FROM [:pref:chat]"); }
}
Bohužel pokud je tam jen "/trash" tak se nic nestane.. musí tam být alespoň "/trash něco" jinak to nefunguje.. nevíte prosím co s tím?
ShiraNai7
Profil
Fisak:
Použij tu funkci, co jsem tu psal.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: