PHP preg_replace_callback函数来模仿把手js

时间:2014-07-04 09:54:55

标签: php regex function preg-replace handlebars.js

所以我有这个非常简单地模仿handlebars.js的php函数,我已经创建了这个,所以客户可以从wordpress发送个性化的电子邮件。

例如:

  

您好 {{name}}

     

感谢您与我们联系。

     

亲切的问候,

     

{{作者}}

会回来:

  

您好 John

     

感谢您与我们联系。

     

亲切的问候,

     

萨拉

此函数在mail()函数之前运行。我的问题是..当在同一行使用这些标签时,函数会忽略它们

示例:

  

您好 {{firstname}} {{lastname}}

     

感谢您与我们联系。

     

亲切的问候,

     

{{作者}}

会回来:

  

您好 {{firstname}} {{lastname}}

     

感谢您与我们联系。

     

亲切的问候,

     

萨拉

现在我的代码:

    $subject = 'Hello {{name}}, this is an exaple';
    $replace = array(
        '{{name}}' => $name,
        '{{email}}' => $email,
        '{{phone}}' => $phone
    );

    $output = preg_replace_callback('/\{\{(.+)\}\}/', function($match) use ($replace) {
        if(isset($replace[$match[0]])){
            return ($replace[$match[0]]);
        } else {
            return($match[0]);
        } 
    }, $subject);

2 个答案:

答案 0 :(得分:0)

?后面添加.+

,使您的模式不合适
/\{\{(.+?)\}\}/

默认情况下,(贪婪的)正则表达式会抓住所有内容(尽可能多),直到最后一次出现在你的情况下

  

{{ firstname}} {{lastname }}

因为lastname之后的两个花括号是当前行中可以匹配的最后一个花括号。

答案 1 :(得分:0)

为什么之前有效:

  1. .表达式匹配到换行符,除非您使用/s修饰符;如果没有,你会更快地看到效果,
  2. 每行只有一个标签;上述陈述的延伸,但具体针对.+.*的贪婪性质。
  3. 假设在标签内部没有大括号,您可以将内存捕获更改为:

    /\{\{([^}]+)\}\}/
         ^^^^^^^
    

    这意味着"匹配任何不是结束大括号的东西"。