从回调中更新 preg_replace_callback 之外的变量 [重复]

Posted

技术标签:

【中文标题】从回调中更新 preg_replace_callback 之外的变量 [重复]【英文标题】:Update variable outside of preg_replace_callback from within the callback [duplicate] 【发布时间】:2015-07-05 16:52:38 【问题描述】:

我有一个看起来像这样的函数...

function filterwords($input='poo poo hello world bum trump')

    $report_swear = 0;

    $badwords = array('poo','bum','trump');

    $filterCount = sizeof($badwords);

    for($i=0; $i<$filterCount; $i++)
            $input = preg_replace_callback('/\b'.preg_quote($badwords[$i]).'\b/i', function($matches) use ($report_swear) 
                $report_swear++;
                return str_repeat('*', 4);
            , $input);
    

    print_r($report_swear);

    return $input;


在本例中,我希望 $report_swear 变量返回 4,但它仍然返回 0。

知道如何在回调中更改它吗?

谢谢

【问题讨论】:

您需要通过引用传递您的变量以将其更改为超出回调函数的范围。 听起来像是一个计划,但我该怎么做呢? php.net/manual/en/language.references.pass.php 就是这样。 【参考方案1】:

我不确定您到底想做什么,但请注意,您可以使用 preg_replace_* 的第 4 个参数,它是一个计数器。您可以构建一个模式作为替代,而不是循环所有单词(优点是您的字符串只解析一次,而不是每个单词一次)

function filterwords($input='poo poo hello world bum trump')
    $badwords = array('poo','bum','trump');
    $badwords = array_map('preg_quote', $badwords);
    $pattern = '/\b(?:' . implode('|', $badwords) . ')\b/i';

    $result = preg_replace($pattern, '****', $input, -1, $count);
    echo $count;
    return $result;

如果要考虑字长:

function filterwords($input='poo poo hello world bum trump')
    $badwords = array('poo','bum','trump');
    $badwords = array_map('preg_quote', $badwords);
    $pattern = '/\b(?:' . implode('|', $badwords) . ')\b/i';

    $result = preg_replace_callback($pattern, function ($m) 
        return str_repeat('*', strlen($m[0]));
    , $input, -1, $count);
    echo $count;
    return $result;

注意:如果您的输入字符串或坏词列表包含 unicode 字符,您需要将 u 修饰符添加到您的模式并使用 mb_strlen 代替 strlen。详见php手册。

【讨论】:

以上是关于从回调中更新 preg_replace_callback 之外的变量 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

PyQt:从回调更新 GUI

立即从进程回调输出更新列表视图 C# WPF

从主队列的回调中更新 UIView 上的 UILabel

Plotly Dash 回调错误更新输出图

UICollectionview 更新回调

MediaSession 没有从 MediaStyle 通知中获得任何回调