PHP正则表达式提取字符串中@提及用户数据的问题求助
解决PHP中提取@[ID:username__FULLNAME]格式提及内容的问题
我来帮你搞定这个正则匹配的问题!你当前的正则表达式没有正确限制匹配范围,所以才会把整个字符串当成一个结果返回。咱们一步步来修正:
原正则的问题分析
你写的(?:(@\[[0-9]+:[\s\S(?!\])]+\]*))有两个核心问题:
[\s\S(?!\])]+逻辑错误:[\s\S]已经能匹配任意字符(包括]),后面的(?!\])零宽断言放在字符集里完全不起作用,导致正则会一直匹配到字符串末尾。- 多余的
\]*会匹配多个],但我们只需要匹配单个闭合的]。
正确的正则表达式
我们需要明确匹配规则:从@[开始,匹配整数ID,然后是冒号,接着匹配直到第一个]为止的所有内容,最后以]结尾。对应的正则是:
$pattern = '/@\[\d+:[^\]]+\]/';
解释一下各部分:
@\[:精准匹配开头的@[([是正则特殊字符,需要转义)\d+:匹配1个及以上的数字(对应你的ID整数)::匹配ID和用户名之间的冒号[^\]]+:匹配除了]之外的任意字符(包括字母、特殊符号、非ASCII字符、空格,完美覆盖你的username和FULLNAME格式)\]:匹配结尾的闭合](同样需要转义)
完整PHP代码示例
$string = 'Hi @[4232:mark__MΛRK ATTLEY] how are you ? Hi @[4232:ryan__RYΛN вυηту] how are you ? Hi @[4232:david__DΛVID शाहिद ] how are you ? '; $pattern = '/@\[\d+:[^\]]+\]/'; preg_match_all($pattern, $string, $mentionList, PREG_PATTERN_ORDER); print_r($mentionList);
运行结果
Array ( [0] => Array ( [0] => @[4232:mark__MΛRK ATTLEY] [1] => @[4232:ryan__RYΛN вυηту] [2] => @[4232:david__DΛVID शाहिद ] ) )
完全符合你期望的结果!
内容的提问来源于stack exchange,提问作者Aefits
相关产品推荐
相关产品推荐

