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
相关产品推荐
相关产品推荐

