Find and Replace Hashtags and Mentions in PHP

Social network messages often use hashtags and username mentions to build connections. For example, following message mentions username such as @dummyuser and has hashtags such as #dummytag.

A dummy message mentioning @dummyuser and @dummyuser0, 
and tagged with #dummytag and #dummytag0

The following examples show how to retrieve and replace hashtags and mentions using regular expressions in PHP.

Find All Hashtags and Mentions

The following code uses preg_match_all to retrieve all hashtags or usernames into an array.

$msg = "A dummy message mentioning @dummyuser and @dummyuser0,".
       " and tagged with #dummytag and #dummytag0";
preg_match_all('/(#\w+)/', $msg, $matches);
foreach ($matches[0] as $hashtag)
	echo $hashtag . ' ';

preg_match_all("/(@\w+)/", $msg, $matches);
foreach ($matches[0] as $username)
	echo $username . ' ';

The output is as follows.

#dummytag #dummytag0 @dummyuser @dummyuser0

The function preg_match_all performs a global regular expression match. It searches subject for all matches to the regular expression given in pattern and puts them in matches.

int preg_match_all ( string $pattern , string $subject, 
                     array &$matches )

Note that $matches[0] is an array of full pattern matches. Details can be found from the official document: preg_match_all.

Replace Hashtags and Mentions by HTML Code

The following code uses preg_replace to replace all hashtags or usernames by links to relevant pages.

$new_msg = preg_replace('/#(\w+)/', 
                    '<a href="$1">#$1</a>', 
echo $new_msg;
$new_msg = preg_replace('/@(\w+)/',  
                    '<a href="$1">@$1</a>', 
echo $new_msg;

Using indexed arrays, the following code replaces both hashtags and usernames.

$pat = array('/#(\w+)/', '/@(\w+)/');
$rep = array('<a href="$1">#$1</a>', 
             '<a href="$1">@$1</a>');
$new_msg = preg_replace($pat, $rep, $msg);

The function preg_replace performs a regular expression search and replace. It searches subject for matches to pattern and replaces them with replacement.

mixed preg_replace ( mixed $pattern , mixed $replacement , 
                     mixed $subject )

Details can be found from the official document: preg_replace.