Like the title says, you have a PHP script where a (supposedly long) case switch statement is placed, and you want to programmatically get a list of all the strings for each case.
My use case is, I have a Telegram bot for my own private use, which does several actions, all different among themselves, when receiving user input from a specific account (mine).
The command strings are predetermined, so I have a -long- list of cases like so:
switch(strtolower($text)) {
case "blah1":
dosomething1();
break;
case "blah2":
file_put_contents($somefile,2);
break;
case "blah3":
echo file_get_contents($someurl);
break;
// [...]
case "blah12":
exec('php somescript.php > /tmp/somescript.log 2>&1 &');
break;
}
I am adding new commands all the time, with the most different functions, and I might even forget some neat functions exist, so I wanted to implement a function where, in reply to a certain command, the bot lists all possible other commands (a --help
function of sorts if you might).
They cannot be simply put inside an array, to be neatly listed at my pleasure, not with a useless excercise of my patience. Also, the listing functionality comes second, the first utility is semantical appropriatedness.
Let’s first say that there is no builtin function in PHP to get a list of cases in switch statement but you can still hack a function yourself.
The following solution is very ugly, but it will work on a simple code, and I would use this only if both of following conditions are verified:
- You are the only user of the script (my telegram bot takes into account commands only if they come from my account)
- the whole code in the script file basically revolves around the case switch and not much else
This scenario perfectly fits my case, so here’s what I did:
preg_match_all('/case \"([a-z0-9\s]+)\"\:/', file_get_contents(__FILE__), $matches);
You then can use:
foreach ($matches[1] as $casestring) {
//...
}
or rather, as I actually did in the end, I simply returned:
$reply=implode("\n",$matches[1]);