Convert: “preg_replace” -> “preg_replace_callback”

后端 未结 1 1170
灰色年华
灰色年华 2020-12-22 05:04

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(\"#§         


        
相关标签:
1条回答
  • 2020-12-22 05:51

    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>.
    
    0 讨论(0)
提交回复
热议问题