How to replace text with a regex pattern and integrate a counter in the replacement text?

前端 未结 3 1426
孤街浪徒
孤街浪徒 2021-01-27 07:30
function parse($string){
    $counter = 0;
    
    $string = preg_replace("_\\[b\\](.*?)\\[/b\\]_si", \'\'. $counter .\'. $1&l         


        
3条回答
  •  终归单人心
    2021-01-27 07:47

    You don't need to declare a global "counter" variable or design a class-based workaround. You can simply use a static variable declaration inside of preg_replace_callback()'s custom function.

    Code: (Demo) -- this is the way I would code my own project

    $ubbText = <<' . (++$counter) . '. ' . $m[1] . '';
             },
             $ubbText
         );
    

    Alternatively, you could avoid the use of a static declaration and use preg_replace() because your code logic will not possibly replace replacements (an infinite loop is not possible). To be honest, I don't prefer this technique because it involves iterated preg_ function calls which make one replacement per iteration and the regex engine will need to restart from the beginning of the input string each time.

    Code: (Demo)

    $counter = 0;
    do {
        $ubbText = preg_replace(
            "~\[b](.*?)\[/b]~si",
            '' . (++$counter) . '. $1',
             $ubbText,
             1,
             $count
         );
    } while ($count);
    echo $ubbText;
    

    Output (from both snippets):

    1. Hey
    2. Hello
    

    p.s. I suppose I should state for the record that your regex pattern will not favorably handle the possibility of nested tags [b] bold [b]re-bold[/b][/b]. If these types of occurrences are not possible in your application's text, then no worries. There are ways to mitigate this vulnerability, but I will not digress in this post. Search Stack Overflow for this if your application requires it.

提交回复
热议问题