使用 preg_replace_callback 查找并替换具有可变数量参数的函数签名

Posted

技术标签:

【中文标题】使用 preg_replace_callback 查找并替换具有可变数量参数的函数签名【英文标题】:Using preg_replace_callback to find and replace a function signature with a variable number of parameters 【发布时间】:2021-01-27 19:29:49 【问题描述】:

使用 php preg_replace_callback 函数,我想用子字符串 "X1X2" 替换模式 "function([x1,x2])",用子字符串 "function([x1,x2,x3])" "X1X2X3",一般来说:"function([x1,x2,...,x2])" 带有子字符串 "X1X2...Xn" -- 在给定的字符串中。

感谢this previous question 中的Wiktor,我让它适用于接受两个参数的函数:

// $string is the string to be searched
$string = preg_replace_callback('/function\(\[([^][\s,]+),([^][\s,]+)\]\)/', function ($word) 
        $result = strtoupper($word[2]) . strtoupper($word[2]);              
        return $result;
        , $string);

我想更进一步,让它适用于具有任意数量参数的函数。我尝试使用正则表达式'/function\(\[[([^][\s,]+)]+[,]*\]\)/' 来表示我想要一个重复的非白色子字符串,后跟一个可选的逗号——来解释最后一个没有逗号的函数参数。然而,这让 PHP 抱怨正则表达式不正确。

感谢您的帮助,

谢谢。

【问题讨论】:

【参考方案1】:

您可以使用简单的binary_function\(\[(.*?)]\) 正则表达式匹配和捕获function([]) 之间的所有内容,然后用逗号分割内容,并重新加入大写字符串:

$text = 'binary_function([x,y]) and binary_function([x1,y1,z1])';
echo preg_replace_callback('~binary_function\(\[(.*?)]\)~', function ($m) 
    return implode("", array_map(function ($x)  return strtoupper($x); , explode(",", $m[1])));
, $text);
// => XY and X1Y1Z1

请参阅PHP demo。

如果([]) 内可以有空格,您可以trim() 输入值。

【讨论】:

以上是关于使用 preg_replace_callback 查找并替换具有可变数量参数的函数签名的主要内容,如果未能解决你的问题,请参考以下文章

preg_replace_callback函数

使用 preg_replace_callback 查找并替换具有可变数量参数的函数签名

将preg_replace()改写为preg_replace_callback()

从 preg_replace 到 preg_replace_callback

preg_replace_callback 正则替换回调方法用法,

如何将 preg_replace e 转换为 preg_replace_callback?