为了账号安全,请及时绑定邮箱和手机立即绑定

Substr 如果 preg_match?

Substr 如果 preg_match?

PHP
米琪卡哇伊 2023-05-12 15:56:45
我正在做一个简单的基于文本的聊天游戏(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.*)

正则表达式演示


查看完整回答
反对 回复 2023-05-12
  • 1 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信