我正在做一个简单的基于文本的聊天游戏(PHP+Mysql)。当用户键入某些编码时,我想做一些兴趣响应/功能。示例:我允许用户搜索帮助,他们只需#help#在聊天栏中输入并回车,然后就会弹出一个帮助中心给他们。他们也可以在不同的聊天室聊天,但是当他们键入#cAll# Hello every one并输入时,所有聊天室都可以看到Hello every one. 但是我怎么只抓住Hello every one没有的#cAll#呢?我目前的编码如下:$chatting = addslashes($_GET['chatting']);preg_match("/(?<=#).*?(?=#)/", $chatting, $match);if($match[0] == 'cAll'){ $data['ctype'] = 1;//show to all chatroom $chatting = ???? //i would like catch the $chatting without #cAll#}if($match[0] == 'help'){ //my popup help coding...}$chatting = iconv('UTF-8',$_G['chatset'],$chatting);$data['areaid'] = $chatroomid;$data['ctext'] = $chatting;C::t('#'.$jn.'#'.$jn.'_chatting')->insert($data);//my template language to insert the data to database除此之外,如何response仅当 the #keyword#is 匹配在用户句子前面时?例子:仅响应#cAll# hello world或#cAll#hello world不要回应hello world #cAll#不要回应hello #cAll# world
1 回答
慕田峪4524236
TA贡献1875条经验 获得超5个赞
您可以考虑使用带有 2 个捕获组的模式,其中部分#
从字符串的开头开始,以防止它像示例中那样出现在用户句子之后。
在第 1 组中捕获 2 之间的内容#
,在第 2 组中捕获它之后的内容。
^#(\w+)#\h*(.+)
解释
^
字符串的开始#(\w+)#
#
在组 1之间匹配 1+ 个单词字符\h*
匹配 0+ 个水平空白字符以不捕获这些字符(.+)
匹配除换行符以外的任何字符 1 次以上
然后你可以使用组1的值来检查cAll
和使用组2的值来聊天。
例如:
if (preg_match("/^#(\w+)#\h*(.+)/", $chatting, $match)) { if ($match[1] == 'cAll') { $data['ctype'] = 1;//show to all chatroom $chatting = $match[2]; } }
如果模式可以匹配之间的多个单词字符#
,则聊天应至少包含一个非空白字符:
^#([^\r\n#]+)#\h*(\S.*)
- 1 回答
- 0 关注
- 105 浏览
添加回答
举报
0/150
提交
取消