Telegram-bot项目地址:https://github.com/xiwangly2/telegram-bot

QRSpeed正则表达式学习:https://www.lolichan.vip/threads/qrspeed-9.109/

telegram-bot开发

遇到的问题

在telegram-bot开发过程中,我发现对于需要同时提交多个参数的命令传统的匹配方式已经不能满足开发的需要,例如:(请忽略本站的文件类型标识错误)

<?php
...
elseif(preg_match('/ping /i',"{$msg}"))
	$ip = substr($msg,6);
	$ip = $var1;
	include_once './ping.php';
	@sendtgtext($sc);
}
...
?>

我想要增加一个ping的次数选项(即-c选项),但直接用正则表达式的preg_matchsubstr截取第二个空格后的文本显得太臃肿了,于是我想到php能不能像QRSpeed一样参数使用%参数1%%参数2%%参数3%,......这样提取字符串。

提出方案

在实验中,我发现php支持使用变量(的值)作为变量名称,举个例子:

<?php
$a = 'b';
$$a = 'Hello World';
echo($b);
?>

此处的$b变量可以正常的创建,赋值和输出,这就给批量创建变量提供了很大的便利。

于是我又构思了一个下午写出了这个函数:

function pre($msg){
	//正则表达式解析文本参数
	//使用空格分隔短语
	$array = preg_split("/( )+/",$msg);
	$num = count($array);
	for($i = 0;$i < $num;$i++){
		$c = 'var'.$i;
		global $$c;
		$$c = $array[$i];
	}
}

一开始我想使用foreach循环实现遍历,但中途出现了很多神奇的问题,于是就换成了for循环实现遍历。然后一开始想到了用正则表达式断言方法实现字符串定位,但实践发现这样对于php来说太麻烦了,于是换用了preg_split实现分割符合条件的字符串为数组。提取变量只需要$var0$var1$var2,......这样以此类推,使用global关键字让函数外也能使用这个(些)变量。

elseif($var0 == '/ping'){
	@sendtgtext('请耐心等待...');
	$ip = $var1;
	include_once './ping.php';
	@sendtgtext($sc);
}

顺便还增加了一句提示等待的话,@sendtgtext('请耐心等待...');sendtgtext是用于发送文本到telegram的函数,函数代码如下:

function sendtgtext($text){
	//发送文本消息
	global $connectroot,$chat_id,$getdatamax;
	$text = @rawurlencode($text);
	$url = "{$connectroot}sendmessage?chat_id={$chat_id}&text={$text}";
	if(strlen($url) <= $getdatamax){
		getHttps($url);
	}
	else{
		post("{$connectroot}sendmessage","chat_id={$chat_id}&text={$text}");
	}
}

中间的判断语句是根据情况选择GET或POST方法发送消息的判断,更多可看开头给出的telegram-bot开发文章。

ping的更多参数功能待完善......