Preg Replace - replace second occurance of a match

后端 未结 3 1884
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-20 09:22

I am relatively new to php, and hope someone can help me with a replace regex, or maybe a match replace I am not exactly sure.

I want to automatically bold the (seco

相关标签:
3条回答
  • 2020-12-20 09:33

    The regular expression itself cannot count, and the preg_ functions provide little help. You need a workaround. If you were to actually search for just a word, you might want to use string functions. Otherwise try:

    // just counting
    if (7 >= preg_match_all($pattern, $subject, $matches)) {
    
       $cb_num = 0;
       $subject = preg_replace_callback($pattern, "cb_ibu", $subject);
    }
    
    function cb_ibu($match) {
        global $cb_num;
    
        $match = $match[0];
    
        switch (++$cb_num) {
            case 2: return "<b>$match</b>";
            case 4: return "<i>$match</i>";
            case 7: return "<u>$match</u>";
            default: return $match;
        }
    }
    

    The trick is to have a callback which does the accounting. And there it's quite easy to add any rules.

    0 讨论(0)
  • 2020-12-20 09:34

    You could use preg_split to split the text at the matches, apply the modifications, and then put everything back together:

    $parts = preg_split('/(example)/', $str, 7, PREG_SPLIT_DELIM_CAPTURE);
    if (isset($parts[3])) $parts[3] = '<b>'.$parts[3].'</b>';
    if (isset($parts[7])) $parts[7] = '<i>'.$parts[7].'</i>';
    if (isset($parts[13])) $parts[13] = '<u>'.$parts[13].'</u>';
    $str = implode('', $parts);
    

    The index formula for the i-th match is index = i · 2 - 1.

    0 讨论(0)
  • 2020-12-20 09:36

    That's an interesting question. My implementation would be:

    function replace_exact($word, $tag, $string, $limit) {
        $tag1 = '<'.$tag.'>';
        $tag2 = '</'.$tag.'>';
        $string = str_replace($word, $tag1.$word.$tag2, $string, 1);
        if ($limit==1) return $string;
        return str_replace($tag1.$word.$tag2,$word,$string,$limit-1);
    }
    

    Use it like this:

    echo replace_exact('Example', 'b', $source_text, 2);
    echo replace_exact('Example', 'i', $source_text, 4);
    

    I don't know about how fast this will work, but it will be faster than preg_replace.

    0 讨论(0)
提交回复
热议问题