Jump to content

Using preg_replace with a function


BradleySmith

Recommended Posts

Hey, I am trying to write a sort of replace function where {user:1} is converted into a set of information from a database using preg_replace. So I have created the following preg_replace:

 

$patterns = array();
$patterns[1] = '/\{user:([0-9]+)\}/';

$replacements = array();
$replacements[1] = UserCredit('$1');

ksort($patterns);
ksort($replacements);

$content_show = preg_replace($patterns, $replacements, $content);

echo $content_show;

 

and then the function UserCredit which is just above that on the page:

 

function UserCredit($user_id) {
require 'connect.php';
	$user_lookup = mysql_query("SELECT * FROM prop_users WHERE ID = '$user_id'");
	while($row = mysql_fetch_array($user_lookup)) {
		$user_name = $row['full_name'];
		$user_file = $row['credit_file'];
		$user_url = $row['link_url'];
		$user_url_alt = $row['link_alt'];
	}
	if(mysql_num_rows($user_lookup)==0){
	  die("An error has occured, Sorry for any Inconvenience Caused! User ID=".$user_id);
	}
require 'close.php';
$output = "<li class=\"clearfix\"><div class=\"credimg\"><img src=\"".$user_file."\" width=\"75px\" height=\"75px\" alt=\"".$user_name."\" /></div><p><strong><a href=\"".$user_url."\" title=\"".$user_url_alt."\">".$user_name."</a></strong><br /><em>Writing / Code</em></p></li>";
return $output;
}

 

I have tested the function and it works when I echo UserCredit('1');

 

And the preg_replace works at simply extracting the value for the user.

 

The only problem is that I can't figure a way for the preg_replace to carry the value of $1 into the function it just literally carries "$1"

 

Is there something obvious that I am missing or am I going around this the wrong way?

Link to comment
Share on other sites

single quotes means literal string

 

$replacements[1] = UserCredit($1);

 

Actually, in this case the $1 is a regex backreference so it would be OK.  Here is the problem:

 

When you do this, usercredit() is immediately called and sent the literal string '$1', so it will always be the same:

 

$replacements[1] = UserCredit('$1');

 

What you want to do is have literal PHP code assigned and then use the e modifier in your pattern to actually have preg_replace() execute the code with the substituted backreference:

 

$patterns[1] = '/\{user:([0-9]+)\}/e';

$replacements[1] = 'UserCredit("$1")';

 

You can also look at preg_replace_callback().

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.