PHP 正则表达式用于替换大括号中的空格,包括大括号


php regex to replace spaces in braces including braces

我想知道是否有可能使用 RegEx-es 解决这种模板解析我的文字类似于:

'Hello, {{ Na me|{{Surname }}}}. Would you like some drink? {{CoffeePreferred? We have a special discount for coffee}} {{Tea Preferred? We have a special discount for tea}}'

首先,我需要修复变量名称中的错误(变量必须始终紧跟在大括号之后的特殊符号,如"?"或"|"或其他可以是逗号或点 - 这意味着将来可以添加规则)。

Na meTea Preferred Surname变量名的拼写错误。此外,变量名称应该在大括号后面不包含空格之后以右开头 - 否则这也是一个错误。

然后我需要保持文本原样。

但是亲爱的朋友,我们有咖啡的特别折扣,我们有茶的特别折扣是简单的文字。

所以我的问题是如何替换变量中下划线中不必要的空格并将它们保留在文本中?此外,我希望以尽可能少的步骤完成它(由于性能影响,我的文本可能需要兆字节)。

我希望我的文字是:

'Hello, {{Na_me|{{Surname}}}}. Would you like some drink? {{CoffeePreferred? We have a special discount for coffee}} {{Tea_Preferred? We have a special discount for tea}}'

我的第一步是提取牙套的内容:

preg_replace_callback(
    '/('{'{)(.*?)('}'})/ui',
    function ($matches) {
        echo $matches[2];
});

然后我试图用上述规则替换空格,但没有成功。我尝试使用像/['s](?!<='|)/这样的断言和像('s(?!'|))|((?!'|)'s)有人知道吗?

这是一种完成这项工作的方法:

$str = preg_replace_callback(
    '/'{'{([^|?{}]+)/',
    function ($matches) {
        $ret = trim($matches[1]);
        return preg_replace('/ /', '_', $ret);
    },
    $str
);

之后,您可以删除所有大括号:

$str = preg_replace('/[{}]+/', '', $str);