在 preg_replace 中的第二项或第三项上应用函数(preg_replace_callback?)

发布于 2025-01-02 01:59:22 字数 1069 浏览 1 评论 0原文

我下面有一个简单的 (BBCode) PHP 代码,用于将代码插入评论/帖子中。

function highlight_code($str) {  
    $search = array( 
                   '/\[code=(.*?),(.*?)\](((?R)|.)*?)\[\/code\]/is',
                   '/\[quickcode=(.*?)\](((?R)|.)*?)\[\/quickcode\]/is'
                   );

    $replace = array(  
            '<pre title="$2" class="brush: $1;">$3</pre>',
            '<pre class="brush: $1; gutter: false;">$2</pre>'
            );  

    $str = preg_replace($search, $replace, $str);  
    return $str;  
}  

我想要做的是在这些位置插入函数:

    $replace = array(  
            '<pre title="$2" class="brush: $1;">'.myFunction('$3').'</pre>',
                                                       ^here
            '<pre class="brush: $1; gutter: false;">'.myFunction('$2').'</pre>'
                                                           ^here
            );  

从我读到的内容来看,我可能需要使用 preg_replace_callback() 或 e-modifier,但我不知道如何着手做这件事;我对正则表达式的了解不是很好。希望得到一些帮助!

I have below a simple (BBCode) PHP code for insert code into a comment/post.

function highlight_code($str) {  
    $search = array( 
                   '/\[code=(.*?),(.*?)\](((?R)|.)*?)\[\/code\]/is',
                   '/\[quickcode=(.*?)\](((?R)|.)*?)\[\/quickcode\]/is'
                   );

    $replace = array(  
            '<pre title="$2" class="brush: $1;">$3</pre>',
            '<pre class="brush: $1; gutter: false;">$2</pre>'
            );  

    $str = preg_replace($search, $replace, $str);  
    return $str;  
}  

What I want to be able to do is insert functions at these locations:

    $replace = array(  
            '<pre title="$2" class="brush: $1;">'.myFunction('$3').'</pre>',
                                                       ^here
            '<pre class="brush: $1; gutter: false;">'.myFunction('$2').'</pre>'
                                                           ^here
            );  

From what I've read on SO I may need to use preg_replace_callback() or an e-modifier, but I cannot figure out how to go about doing this; my knowledge with regex is not so good. Would appreciate some help!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

手长情犹 2025-01-09 01:59:22

您可以使用此片段(e-修饰符):

function highlight_code($str) {  
    $search = array( 
                   '/\[code=(.*?),(.*?)\](((?R)|.)*?)\[\/code\]/ise',
                   '/\[quickcode=(.*?)\](((?R)|.)*?)\[\/quickcode\]/ise'
                   );
    // these replacements will be passed to eval and executed. Note the escaped 
    // single quotes to get a string literal within the eval'd code    
    $replace = array(  
            '\'<pre title="$2" class="brush: $1;">\'.myFunction(\'$3\').\'</pre>\'',
            '\'<pre class="brush: $1; gutter: false;">\'.myFunction(\'$2\').\'</pre>\''
            );  

    $str = preg_replace($search, $replace, $str);  
    return $str;  
} 

或此片段(回调):

function highlight_code($str) {  
    $search = array( 
                   '/\[code=(.*?),(.*?)\](((?R)|.)*?)\[\/code\]/is',
                   '/\[quickcode=(.*?)\](((?R)|.)*?)\[\/quickcode\]/is'
                   );

    // Array of PHP 5.3 Closures
    $replace = array(
                     function ($matches) {
                         return '<pre title="'.$matches[2].'" class="brush: '.$matches[1].';">'.myFunction($matches[3]).'</pre>';
                     },
                     function ($matches) {
                         return '<pre class="brush: '.$matches[1].'; gutter: false">'.myFunction($matches[2]).'</pre>';
                     }
            );  
    // preg_replace_callback does not support array replacements.
    foreach ($search as $key => $regex) {
        $str = preg_replace_callback($search[$key], $replace[$key], $str);
    }
    return $str;  
} 

You can either use this snippet (e-modifier):

function highlight_code($str) {  
    $search = array( 
                   '/\[code=(.*?),(.*?)\](((?R)|.)*?)\[\/code\]/ise',
                   '/\[quickcode=(.*?)\](((?R)|.)*?)\[\/quickcode\]/ise'
                   );
    // these replacements will be passed to eval and executed. Note the escaped 
    // single quotes to get a string literal within the eval'd code    
    $replace = array(  
            '\'<pre title="$2" class="brush: $1;">\'.myFunction(\'$3\').\'</pre>\'',
            '\'<pre class="brush: $1; gutter: false;">\'.myFunction(\'$2\').\'</pre>\''
            );  

    $str = preg_replace($search, $replace, $str);  
    return $str;  
} 

or this one (Callback):

function highlight_code($str) {  
    $search = array( 
                   '/\[code=(.*?),(.*?)\](((?R)|.)*?)\[\/code\]/is',
                   '/\[quickcode=(.*?)\](((?R)|.)*?)\[\/quickcode\]/is'
                   );

    // Array of PHP 5.3 Closures
    $replace = array(
                     function ($matches) {
                         return '<pre title="'.$matches[2].'" class="brush: '.$matches[1].';">'.myFunction($matches[3]).'</pre>';
                     },
                     function ($matches) {
                         return '<pre class="brush: '.$matches[1].'; gutter: false">'.myFunction($matches[2]).'</pre>';
                     }
            );  
    // preg_replace_callback does not support array replacements.
    foreach ($search as $key => $regex) {
        $str = preg_replace_callback($search[$key], $replace[$key], $str);
    }
    return $str;  
} 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文