PHP PREG_REPLACE REGEX Упоминание имени пользователя - PullRequest
2 голосов
/ 27 февраля 2012

user_model.php

class User_model extends CI_Model{
    function get_fullname_by_username($username){
        $query=$this->db->select('user_first_name,user_last_name')->where('user_name',$username)->get('user');
        if($query->num_rows()==0){
            return FALSE;
        } else {
            return $query->row();
        }
   }
}

post_model.php

class Post_model extends CI_Model{
    function input_post($content,$privacy==FALSE){
        $this->load->library('privacy');
        $this->load->helper('post');
        $uid=uid();//user id based on sessions
        if($privacy==FALSE){
            $privacy=$this->privacy->post_privacy($uid);
        } else {
            $privacy=$privacy;
        }
        $content=mention($content);
        $input=array('post_uid'=>$uid,'post_content'=>$content,'post_privacy'=>$privacy);
        if($this->db->insert('posts',$input)){
            return $this->fetch_single_post_data($this->db->insert_id());
        } else {
            return FALSE;
        }
    }
    function fetch_single_post_data($post_id){
        $query=$this->db->select('id,post_uid,post_content,post_privacy,post_created')->where('id',$post_id)->get('posts');
        if($query->num_rows()==0){
            return FALSE;
        } else {
            return $query->row();
        }
    }
}

post_helper.php

function get_mention_name($username){
    $username=strtolower($username);
    $CI=&get_instance();
    $CI->load->model('user_model');
    $name=$CI->user_model->get_fullname_by_username($username);
    if($name==FALSE){
        return "@".$username;
    } else {
        return "<a href=\"/profile/{$username}.html\">{$name->user_first_name} {$name->user_last_name}</a>";
    }
}

function mention($post_content){
    return preg_replace_callback("REGEX","get_mention_name",$post_content);
}

Прежде всего, английский не мой родной язык,Поэтому, пожалуйста, если моя грамматика плохая, простите меня.

Для моего школьного финального проекта я просто хочу создать Facebook-подобный веб-сайт (социальная сеть).Моя проблема в том, что я хочу создать функцию упоминания на основе имени пользователя (базы данных пользователей).Если в Facebook после того, как я наберу символ @ , система Facebook начнет чаще всего запрашивать друга / страницу с классным отображением списка ajax.Но я не хочу быть таким, в моей системе нет отображения списка ajax.

Если пользователь обновляет статус сообщения с помощью строки, такой как @bias или @tegaralaga или @admin "@tegaralaga, где ты?"для примера.Моя системная проверка базы данных: есть ли пользователь с именем пользователя @tegaralaga, если да, основываясь на user_model.php function get_fullname_by_username (); он вернет user_first_name и user_last_name data.Но если нет, это даст ЛОЖНЫЙ возврат.В моей пользовательской таблице есть пользователь с именем пользователя tegaralaga, имя_пользователя - Bias, а имя_пользователя - Tegaralaga.

Переместиться на post_helper.php , если $ name == FALSE, будет выдана текущая строка, @tegaralaga.Но если имя пользователя существует, оно вернет

"<a href="/profile/{$username}.html">{$name->user_first_name} {$name->user_last_name}</a>"
.

Если существует, строка становится

"<a href="/profile/tegaralaga.html">Bias Tegaralaga</a> where are you?"

Если нет, строка все еще

 "@tegaralaga where are you?"

Итак, мой вопрос:1. Возможно ли с моим кодом выше использовать preg_replace_callback?(посмотрите на post_helper.php)2. Если возможно, каков идеальный REGEX, если мы можем упомянуть более одного имени пользователя, и исключение для адреса электронной почты (поскольку адрес электронной почты также содержит символ @)

1 Ответ

2 голосов
/ 27 февраля 2012

Это должно сработать для вас .. в функции обратного вызова вы получите все совпадения из регулярного выражения .. вам нужно извлечь нужную часть:

function get_mention_name($match){
    $username=strtolower($match[1]);
    $CI=&get_instance();
    $CI->load->model('user_model');
    $name=$CI->user_model->get_fullname_by_username($username);
    if(empty($name)){
        return "@".$username;
    } else {
        return "<a href=\"/profile/{$username}.html\">{$name->user_first_name} {$name->user_last_name}</a>";
    }
}

function mention($post_content){
    return preg_replace_callback(
        "#(?<!\w)@(\w+)#",
        "get_mention_name",
        $post_content);
}
...