您好!欢迎访问家园网-www.jy.wang!

家园网

检测微博内容中的@用户并建立关联记录

网络 作者:本站 点击:

请分步逐句讲解下面的php代码:


if(strstr($content,"@")){  				//判断微博内容中是否含有“@”字符
    /** 写入at表 **/
    $reg = "/@([^@\s]+)/";				 //正则匹配,得到@的用户
    $match = array();
    preg_match_all($reg,$content,$match);	 	//得到@用户数组
    $users_array = array_unique($match[1]);	 //去掉重复用户名
    if($users_array){
        $count = count($users_array);			//@的用户总数
        /**查看@用户是否存在,如果存在写入at表**/
        for($i = 0;$i < $count; $i++){
            //mr_user表中查找用户id是否存在
            $select_sql = "select id from mr_user where username = '".$users_array[$i]."'";
            $user_id    = $db->single($select_sql,MYSQL_ASSOC);
            if($user_id){
                //@信息写入到mr_at表
                $insert_sql = "insert into mr_at (user_id,post_id) values
                                ( :user_id , :post_id)";
                $db->query($insert_sql,array('user_id'=>$user_id,'post_id'=>$post_id));
            }
        }
    }
}

代码功能概述

这段PHP代码用于处理微博内容中的@提及功能,主要完成以下任务:

  1. 检测内容中是否包含@符号

  2. 提取所有被@的用户名

  3. 查询用户ID并建立关联记录

逐句解析

  1. if(strstr($content,"@")){
    • 使用strstr()函数检查字符串$content中是否包含@字符

    • 这是整个处理流程的入口条件判断

  2. $reg = "/@([^@\s]+)/";
    • 定义正则表达式模式:

      @匹配字面量@符号

      ([^@\s]+)捕获组匹配非@和非空白字符序列

    • 该模式用于匹配@username格式的用户名

  3. preg_match_all($reg,$content,$match);
    • 执行全局正则匹配:

      将匹配结果存入$match数组

      返回所有匹配的@用户名

  4. $users_array = array_unique($match[1]);
    • 取出匹配结果中的第一个捕获组(用户名)

    • 使用array_unique()去除重复用户名

  5. $count = count($users_array);
    • 计算有效@用户数量

    • 为后续循环处理做准备

  6. for($i = 0;$i < $count; $i++){
    • 开始遍历所有@用户

    • 每个用户单独处理

  7. $select_sql = "select id from mr_user where username = '".$users_array[$i]."'";
    • 构建SQL查询语句:

      mr_user表根据用户名查询ID

      注意存在SQL注入风险(应使用预处理语句)

  8. $user_id = $db->single($select_sql,MYSQL_ASSOC);
    • 执行查询并获取结果

    • single()方法可能返回关联数组形式的单条记录

  9. $insert_sql = "insert into mr_at (user_id,post_id) values ( :user_id , :post_id)";
    • 构建插入语句:

      mr_at表写入关联关系

      使用命名参数(:user_id和:post_id)

  10. $db->query($insert_sql,array('user_id'=>$user_id,'post_id'=>$post_id));
    • 执行插入操作

    • 建立用户ID和微博ID的关联

代码优化建议

  1. 使用预处理语句防止SQL注入

  2. 添加错误处理机制

  3. 考虑批量插入提高性能

  4. 添加日志记录功能 (AI生成)


([^@\s]+)捕获组匹配非@和非空白字符序列。什么意思啊


正则表达式中的([^@\s]+)是一个捕获组,其含义如下:

  1. 结构分解‌:

    • [^...]:表示"否定字符集",匹配‌不在‌方括号内的任意字符

    • @\s:具体排除的字符是@和空白符(\s

    • +:表示匹配前面的模式‌1次或多次

  2. 具体匹配规则‌:

    • @符号

    • 任何空白字符(空格、制表符\t、换行符\n等)

    • 匹配连续的字符序列

    • 这些字符‌不能包含‌:

    • 遇到上述任意禁用字符时立即停止匹配

  3. 在示例中的用途‌:

    $reg = "/@([^@\s]+)/";
    • @user name(含空格)

    • @user@mail(含第二个@)

    • 用于捕获@username形式的用户名

    • 有效匹配示例:@user123

    • 无效情况示例:

  4. 特殊字符说明‌:

    • \s是预定义字符集,等价于[ \t\n\r\f\v]

    • 若需要包含中文等非ASCII字符,通常需要添加u修饰符

这种设计确保了:

  • 用户名不会意外包含分隔符(@)

  • 用户名不会包含破坏格式的空白符

  • 匹配结果可以直接作为有效用户名使用

标签: