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)

stormdrain
  • 7,915
  • 4
  • 37
  • 76
Bias Tegaralaga
  • 2,240
  • 5
  • 21
  • 26

1 Answers1

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);
}
SERPRO
  • 10,015
  • 8
  • 46
  • 63
  • 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. – Bias Tegaralaga Feb 29 '12 at 11:59
  • Well, because I used # as delimiter you have to escape it on your regex.. or change the delimiter like this: `/(?<!\w)#(\w+)/` – SERPRO Feb 29 '12 at 12:53