You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP Telegram Bot技术问题:正则匹配结果如何正确传递给sendMessage

Telegram机器人正则匹配返回问题排查与解决

问题梳理

你在开发Telegram机器人时遇到了正则匹配结果无法正常返回的棘手问题:

  • 用正则preg_match('/\b(?:[a-z]+\d|\d+[a-z])[a-z\d]*\b/i', $text, $matches);提取消息里的字母数字混合单词
  • 调用message($chat_id,$matches,$message_id);时,机器人只会回复Array
  • 调用message($chat_id,$matches[0],$message_id);时,机器人完全没反应
  • 改成message($chat_id,$matches[0][0],$message_id)后,只能拿到匹配单词的第一个字符,得手动拼接多个索引才能获取部分内容

问题根源分析

我帮你拆解下核心问题所在:

  1. URL参数分隔符错误:你的message函数里用了&作为参数分隔符,这是HTML实体编码后的符号,直接放在Telegram API的URL里会被当成参数的一部分,导致text参数根本没被正确解析,所以传$matches[0]时机器人收不到有效内容。
  2. 缺少URL编码处理:要发送的文本(也就是匹配到的字符串)没有做URL编码,如果字符串里包含特殊字符(比如&、空格等),会直接破坏URL结构,导致API调用失败。
  3. 正则匹配数组结构误解:preg_match匹配成功后,$matches是一维数组,$matches[0]就是完整的匹配字符串——你能通过$matches[0][0]拿到第一个字符,说明$matches[0]本身是字符串(PHP里字符串可以像数组一样按索引取字符),这也侧面印证了之前的message函数参数传递逻辑有问题。

解决方案

针对这些问题,我们只需要修改两个核心部分:

1. 修复message函数的API调用逻辑

把参数分隔符换成正确的&,同时对要发送的文本做URL编码:

function bot($data) { 
    return json_decode(file_get_contents("https://api.telegram.org/bot".API_TOKEN."/".$data),true); 
}

function message($chat_id,$msg,$msg_id) { 
    // 对消息内容做URL编码,替换错误的&为标准&
    $encodedMsg = urlencode($msg);
    bot("sendMessage?chat_id=".$chat_id."&text=".$encodedMsg."&reply_to_message_id=".$msg_id); 
}

2. 添加正则匹配的安全判断

在调用message前,先确认正则匹配成功,避免$matches[0]不存在导致的错误:

$chat_id=$update['message']['chat']['id']; 
$message_id=$update['message']['message_id']; 
$text=$update['message']['text'];

// 先判断是否匹配成功,再执行回复
if (preg_match('/\b(?:[a-z]+\d|\d+[a-z])[a-z\d]*\b/i', $text, $matches)) {
    // 直接传递完整的匹配结果$matches[0]即可
    message($chat_id, $matches[0], $message_id);
} else {
    // 匹配失败时给用户明确提示
    message($chat_id, "没有找到符合要求的内容哦", $message_id);
}

验证说明

修改完成后,当用户发送包含字母数字混合的单词(比如ac64fc)时,机器人会正确返回完整的匹配字符串;如果没有匹配到符合规则的内容,也会给用户清晰的反馈。

内容的提问来源于stack exchange,提问作者Za Gol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:09:14