2014-10-02 27 views
0

我有一个函数可以解析一些文本,并用数组中的值替换由"{}"包围的任何标记。使用两个独立模式的正则表达式

function parse($template, array $values) { 
    return preg_replace_callback('/\{"{\ (\w+)\ \}\"/',function ($matches) use ($values) { 
     return isset($values[$matches[1]])?$values[$matches[1]]:$matches[0]; 
     }, 
     $template); 
} 

它怎么可以修改做同样的事情,但也使用第二个删除?具体来说,我还它以取代'{}'

回答

1

一个更好的选择是列出明确可能的分隔符:

$re = <<<RE 
/
    "{ (\w+) }" 
    | 
    '{ (\w+) }' 
/x 
RE; 

(使用扩展语法adability)。实际拍摄组将在matches数组的末尾:

$re = <<<RE 
/
    "{ (\w+) }" 
    | 
    '{ (\w+) }' 
    | 
    <{ (\w+) }> 
    | 
    {{ (\w+) }} 
/x 
RE; 
+0

为什么'/ x'不只是'/'?另外,你使用'end'只是为了得到数组中的最后一个值,对吧?它会不会总是'$匹配[1]'? – user1032531 2014-10-02 20:45:56

+0

@ user1032531:1)'/ x' =扩展语法。 2)不,它可以是“匹配[1]”或“匹配[2]”,取决于匹配的内容。 – georg 2014-10-02 20:52:35

+0

对比赛陷入困境。从未听说过扩展语法。为什么在你的例子中它是必需/期望的。 – user1032531 2014-10-02 20:55:18

1

环绕标签试试这个:

/\{['"]{\ (\w+)\ \}['"]/ 
+0

感谢彼得:一旦你介绍更多的分隔符,尤其是非对称的,例如

preg_replace_callback($re, function ($matches) use ($values) { $word = end($matches); if (isset($values[$word])) etc.... }, 

这冗长将还清。这将不会选择''{bla}“'? – user1032531 2014-10-02 20:32:26

+0

@ user1032531这就是为什么你需要反向引用 – Cheery 2014-10-02 20:33:04

+0

这是真的,我假设你不在乎 – 2014-10-02 20:34:43

1

像这样的东西(没有检查)/\{("|\'){\ (\w+)\ \}\1//\{(["\']){\ (\w+)\ \}\1/

+0

Yikes!你介意解释它是如何工作的吗? – user1032531 2014-10-02 20:33:32

+0

@ user1032531第一轮捕获“或”,并在最后regexp使用反向引用'\ 1'来捕获,以便使用相同的符号。 – Cheery 2014-10-02 20:34:28

+0

啊,我有点理解。 '1'是对它的反向引用,对吧?我不认为你可以在模式中包含'或'。 Opps,我只是意识到你提供了两种模式:)有一天,我需要掌握正则表达式! – user1032531 2014-10-02 20:37:17