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 PreferredSurname是变量名的拼写错误。变量名也应该在花括号后面不包含空格之后开始 - 否则它也是一个错误。

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

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

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

我希望我的文字是:

'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);