Interactive shell using PHP

后端 未结 8 981
醉话见心
醉话见心 2020-11-29 09:20

Just wondering, is it possible to create an interactive shell, using PHP alone. I mean something like you have with databases, python, etc.

If it is, how?

8条回答
  •  爱一瞬间的悲伤
    2020-11-29 09:32

    Here's an expanded take on this. I've added an isCLI() check in case you're run your script both in CLI and on a web server. Otherwise the server could loop using my function. This solution will prompt the user, check the input, and re-prompt the user for fixed input if necessary. I rtrim() the input because if the user uses return to submit their entry, that may be appended to the entry. Validation is not necessary, just don't pass a function in that case.

    function isCLI() {
        return (php_sapi_name() === 'cli' OR defined('STDIN'));
    }
    
    function userPrompt($message, $validator=null) {
        if (!isCLI()) return null;
    
        print($message);
        $handle = fopen ('php://stdin','r');
        $line = rtrim(fgets($handle), "\r\n");
    
        if (is_callable($validator) && !call_user_func($validator, $line)) {
            print("Invalid Entry.\r\n");
            return userPrompt($message, $validator);
        } else {
            print("Continuing...\r\n");
            return $line;
        }
    }
    
    // Example =====================
    
    function validateSetLangCode($str) {
        return preg_match("/^[A-Z0-9]{3}-[A-Z]{2}$/", $str);
    }
    
    $code = userPrompt("Please enter the set / language codes. Use the format 'SET-EN', where SET is the three-letter set code and EN is the two-letter lang code. \r\n", 'validateSetLangCode') ?: 'SET-EN';
    var_dump($code);
    

提交回复
热议问题