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

PHP移除Telegram Webhook接收字符串中📍及指定内容问题求助

解决Telegram Webhook字符串中含不可见字符的匹配移除问题

我太懂这种糟心的情况了——从Telegram接收的文本里经常会混入零宽空格、控制字符这类看不见的“隐形字符”,导致直接用文本匹配完全失效。别着急,咱们一步步来解决:

第一步:先搞清楚字符串里到底藏了什么

首先,你需要把目标字符串转成十六进制,这样就能看清所有字符(包括不可打印的)的真实编码。用PHP的bin2hex()函数就能做到:

$string = "⁣📍 #Amazon blabla";
echo bin2hex($string);

运行后你会得到一串十六进制字符,比如类似e2808be1b4b52023416d617a6f6e20626c61626c61。这里的e2808b就是零宽空格(U+200B)的十六进制编码,e1b4b5对应📍emoji的编码,剩下的就是#Amazon blabla的编码。

第二步:用精准的字符编码来构建正则匹配

知道了隐藏字符的编码后,就可以直接在正则里指定这些字符,确保匹配准确。有两种方式:

方式一:使用十六进制转义序列

// 对应上面的十六进制编码,把要移除的部分拆成转义字符
$cleanedString = preg_replace('/\xe2\x80\x8b\xe1\xb4\xb5 #Amazon/', '', $string);

方式二:使用Unicode编码(更直观)

如果你知道字符的Unicode码点(比如零宽空格是U+200B,📍是U+1F4CD),可以用\x{码点}的写法,记得加上u修饰符让PHP正确处理Unicode多字节字符:

$cleanedString = preg_replace('/\x{200B}\x{1F4CD} #Amazon/u', '', $string);

第三步:通用兜底方案(不确定隐藏字符类型时)

如果不确定前面到底有多少种不可见字符,可以用正则匹配所有控制字符和空白字符,再加上目标emoji和文本:

// \p{C}匹配所有控制字符,\p{Z}匹配所有空白字符,u修饰符开启Unicode模式
$cleanedString = preg_replace('/^[\p{C}\p{Z}]*\x{1F4CD} #Amazon/u', '', $string);

这个写法会匹配字符串开头所有的不可见控制字符、空白字符,再加上📍和#Amazon,一次性全部移除,不管前面藏了多少隐形字符。

为什么你之前的代码无效?

你直接写preg_replace("📍 #Amazon","", $string)时,你的代码里的"📍 #Amazon"是没有那串不可见字符的,但实际接收的字符串里有,所以两者无法匹配,自然替换失败。必须把那些隐藏的字符也纳入匹配规则才行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:20:06