猿问

Substr 如果 preg_match?

我正在做一个简单的基于文本的聊天游戏(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


米琪卡哇伊
浏览 106回答 1
1回答

慕田峪4524236

您可以考虑使用带有 2 个捕获组的模式,其中部分#从字符串的开头开始,以防止它像示例中那样出现在用户句子之后。在第 1 组中捕获 2 之间的内容#,在第 2 组中捕获它之后的内容。^#(\w+)#\h*(.+)解释^字符串的开始#(\w+)##在组 1之间匹配 1+ 个单词字符\h*匹配 0+ 个水平空白字符以不捕获这些字符(.+)匹配除换行符以外的任何字符 1 次以上正则表达式演示然后你可以使用组1的值来检查cAll和使用组2的值来聊天。例如:if&nbsp;(preg_match("/^#(\w+)#\h*(.+)/",&nbsp;$chatting,&nbsp;$match))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($match[1]&nbsp;==&nbsp;'cAll')&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data['ctype']&nbsp;=&nbsp;1;//show&nbsp;to&nbsp;all&nbsp;chatroom &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$chatting&nbsp;=&nbsp;$match[2]; &nbsp;&nbsp;&nbsp;&nbsp;} }如果模式可以匹配之间的多个单词字符#,则聊天应至少包含一个非空白字符:^#([^\r\n#]+)#\h*(\S.*)正则表达式演示
随时随地看视频慕课网APP
我要回答