PHP。如何在 preg_replace_callback() 中将变量插入 $function(variable):

PHP. How to insert variable into $function(varible) in preg_replace_callback():

谁能帮忙修复下一个功能。它的目的是找到一个文本 link 并使其可按特定规则点击。 接下来的问题是: 我不知道如何将变量插入 $function( variable )。 变量生成于preg_replace_callback

Fatal error: Uncaught Error: Function name must be a string in....
function make_clickable($text)
{
    switch( 'strrev' )
    {
        case 'strrev':
            $function = 'strrev';
        break;
        
        case 'base64':
            $function = 'base64_encode';
        break;
        
        default:
            $function = '';
        break;
    }

    $text = preg_replace_callback("#(^|[\n ])([\w]+?://[\w\#$%&~/.\-;:=,?@\[\]+]*)#si", 
        function ($m){
            global $function;
        return "'$m[1]<a href=\"out.' . $phpEx . '?url=" . urlencode( $function( $m[2]) ). "\" target=\"_blank\">$m[2]</a>'";
    }, $text);


    return($text);
}

echo make_clickable('text http://example.net text');
// <a href="./out.php?url=net.example%2F%2F%3Aptth" target="_blank">http://example.net</a>

您不需要在 preg_replace_callback 中声明一个全局变量。您可以简单地使用 use 语句,它可用于使直接范围内的变量可用于 closure/anonymous 函数(see manual, ex. 3 ff.);如下:

$text = preg_replace_callback("#(^|[\n ])([\w]+?://[\w\#$%&~/.\-;:=,?@\[\]+]*)#si", 
    function ($m) use ($function) {
    return "'$m[1]<a href=\"out.' . $phpEx . '?url=" . urlencode( $function( $m[2]) ). "\" target=\"_blank\">$m[2]</a>'";
}, $text);

如果您在当前代码中执行了 var_dump($function);,您会发现 $function 的值是 NULL,因此会出现错误。每当您的 switch 上线时,请记住 default 情况会导致错误。如果你想绕过 $function,你需要有一个条件来检查 if (!empty($function)) ...,并且 return 一个 transformed/plain URL 相应地。

在您上面的代码中,变量 $phpEx 也是未定义的。 (我认为这是一个正在进行的工作。)您可以将它包含在 use 语句中,以及您可能想要使用的其他变量:use ($function, $phpEx) - 但您必须定义显然,它在你的代码中的某个地方。大概是 .php。您可能希望将其定义为常量,以使其在您的所有代码中都可用,而无需担心变量范围。