Domanda

I'm trying to update my code but I'm stuck at this codeline.

How do I proceed to convert this to preg_replace_callback?

$buffer = preg_replace("#§([a-z0-9-_]+)\.?([a-z0-9-_]+)?#ie","\$templ->\\1(\\2)",$buffer);
È stato utile?

Soluzione

Here is the process of converting preg_replace (with the e modifier) to preg_replace_callback. You create a function that will act on all of the matches that it finds. Normally this is pretty simple, however with your case it is a little more complex as the function returns the value of an object. To accommodate this, you can use an anonymous function (a function without a name) and attach the USE keyword with your object to it. This can be done inline, however for the sake of clarity, I have made it its own variable.

Take a look at this portion of the complete code below:

$callback_function = function($m) use ($templ) {

I created a variable named callback_function that will be used in the preg_replace_callback function. This function will be fed each match as the variable $m automatically. So within the function you can use $m[1] and $m[2] to access the parts of the expression that it matched. Also note that I've attached the $templ variable with the USE keyword so that $templ will be available within the function.

Hopefully that makes sense. Anyway, here is the complete code:

<?php

// SET THE TEXT OF THE BUFFER STRING
$buffer = 'There are a bunch of §guns.roses growing along the side of the §guns.road.';

// THIS IS JUST A SAMPLE CLASS SINCE I DO NOT KNOW WHAT YOUR CLASS REALLY LOOKS LIKE
class Test {

    // FUNCTION NAMED 'guns' WITH A SPACE FOR A PARAMETER
    public function guns($info) {
        return '<b>BLUE '.strtoupper($info).'</b>';
    }

}

// INSTANTIATE A NEW 'Test' CLASS
$templ = new Test();

// THIS IS THE FUNCTION THAT YOUR CALLBACK WILL USE
// NOTICE THAT IT IS AN ANONYMOUS FUNCTION (THERE IS NO FUNCTION NAME)
$callback_function = function($m) use ($templ) {
    return $templ->$m[1]($m[2]);
};

// THIS USES PREG_REPLACE_CALLBACK TO SUBSTITUTE OUT THE MATCHED TEXT WITH THE CALLBACK FUNCTION
$buffer = preg_replace_callback('/§([a-z0-9-_]+)\.?([a-z0-9-_]+)?/i', $callback_function, $buffer);

// PRINT OUT THE FINAL VERSION OF THE STRING
print $buffer;

This outputs the following:

There are a bunch of <b>BLUE ROSES</b> growing along the side of the <b>BLUE ROAD</b>.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top