2

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);
}

First off all, English isn't my native language. So, please if my grammar is bad forgive me.

For my school final project i just want to create Facebook like website (social networking). My problem is, i want to create mention feature, based on username (user database). If at Facebook after I type the @ symbol, Facebook system begin to query most possibly Friend/Page with cool ajax list display. But i don't want be like that, at my system there's no ajax list display.

If user post status update with string like @bias or @tegaralaga or @admin "@tegaralaga where are you?" for the example. My system check on database is there any user with username @tegaralaga, if yes based on user_model.php function get_fullname_by_username(); it will return user_first_name and user_last_name data. But if no it will give FALSE return. On my user table there's user with tegaralaga username, the user_first_name is Bias and user_last_name is Tegaralaga.

Move at post_helper.php, if $name==FALSE it will give current string, @tegaralaga. But if the username is exists, it will return

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

If exists, the string become

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

If doesn't, the string still

 "@tegaralaga where are you?"

So my question is :
1. Is it possible with my code above using preg_replace_callback? (take a look at post_helper.php)
2. If possible, what is the perfect REGEX if we can mention more than 1 username, and the exception for email address (because email address contains @ symbol too)

1 Answer 1

2

This should work for you.. on your callback function you receive all the matches from the regexp.. you need to extract the part you need:

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);
}
Sign up to request clarification or add additional context in comments.

2 Comments

one more questions. what about hash like #wearetheworld. i change the regex from "#(?<!\w)@(\w+)#" to "#(?<!\w)#(\w+)#" i'm really sure that won't works, but i have no idea about regex :'( or could you help me with some guide about regex, website or something.
Well, because I used # as delimiter you have to escape it on your regex.. or change the delimiter like this: /(?<!\w)#(\w+)/

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.