Search code examples
phppreg-replacepreg-replace-callback

How to use preg_replace_callback?


I have the following HTML statement

[otsection]Wallpapers[/otsection]
WALLPAPERS GO HERE

[otsection]Videos[/otsection]
VIDEOS GO HERE

What I am trying to do is replace the [otsection] tags with an html div. The catch is I want to increment the id of the div from 1->2->3, etc..

So for example, the above statement should be translated to

<div class="otsection" id="1">Wallpapers</div>
WALLPAPERS GO HERE

<div class="otsection" id="2">Videos</div>
VIDEOS GO HERE

As far as I can research, the best way to do this is via a preg_replace_callback to increment the id variable between each replacement. But after 1 hour of working on this, I just cant get it working.

Any assistance with this would be much appreciated!


Solution

  • Use the following:

    $out = preg_replace_callback(
        "(\[otsection\](.*?)\[/otsection\])is",
        function($m) {
            static $id = 0;
            $id++;
            return "<div class=\"otsection\" id=\"ots".$id."\">".$m[1]."</div>";
        },
        $in);
    

    In particular, note that I used a static variable. This variable persists across calls to the function, meaning that it will be incremented every time the function is called, which happens for each match.

    Also, note that I prepended ots to the ID. Element IDs should not start with numbers.


    For PHP before 5.3:

    $out = preg_replace_callback(
        "(\[otsection\](.*?)\[/otsection\])is",
        create_function('$m','
            static $id = 0;
            $id++;
            return "<div class=\"otsection\" id=\"ots".$id."\">".$m[1]."</div>";
        '),
        $in);