php正则表达式替换括号中的空格,包括括号

时间:2016-04-27 16:48:35

标签: php preg-replace-callback

我想知道是否可以使用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是变量名称的拼写错误。 <= p>后,变量名也应该在花括号后面没有空格之后才开始。 - 否则它也是错误的。

然后我需要保持原样。

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

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

我希望我的文字是:

'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)这样的表达式。有人有任何想法吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

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