使用两种不同模式的正则表达式


Regular expressions using two separate patterns

我有一个函数,它解析一些文本,并用数组中的值替换被"{}"包围的任何标记。

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

它怎么能被修改为同样的,但也使用第二个除法器?具体来说,我还用它来替换由'{}' 包围的标签

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

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

(为了可读性,使用扩展语法)。实际捕获的组将位于matches阵列的末尾:

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

一旦引入更多的分隔符,尤其是非对称分隔符,这种冗长的描述就会得到回报,例如:

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

类似的东西(未检查)/'{("|''){' ('w+)' '}'1//'{(["'']){' ('w+)' '}'1/

试试这个:

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