更换后更改上一个单词

时间:2014-03-29 13:53:01

标签: php regex templates

我有一个模板系统,用数据库中相应的值替换大括号内的每个关键字。

  

示例:公司和 {INSTITUTION} 同意......

问题是有些模板是西班牙语,并且有一条规则说当一个单词以字母i开头时,前一个“和”连接符为e而不是y

实施例: 通常的方式是说:

  

Iván y Pedro。

但如果第二个名称以i开头,则连接符为e

  

Pedro e Iván

我需要找到一种方法来进行这些替换以获得准确的文档。

我知道我可以进行双重处理,首先替换关键字,然后将模式" y i"替换为" e i",但我不确定这是否是解决此问题的最佳方法。

我用于替换的代码如下:

$content = preg_replace_callback('#{(.*?)}#', 
     function ($key) use ($agreement) {
          return utf8_decode($agreement[strtolower($key[1])]);
     }, 
$content);

其中$content是模板文本,$agreement是包含数据库值的数组。

注意:它应区分大小写。例如,如果文字为Pedro y Iván,则应将其替换为Pedro e Iván,而不是Pedro e iván

答案:根据Chris的回答,我最终得到了这段代码,如果原始的y是大写或小写的话会引起注意。

$text = preg_replace_callback(
    '#( [Yy] )?{(.*?)}#',
    function ($matches) use ($data) {
        $and = '';
        $replacement = utf8_decode($data[strtolower($matches[2])]);
        if ($matches[1]){
            $and_replacement = array(' Y '=>' E ',' y '=>' e ');
            $and = in_array(substr($replacement,0,1),array('i', 'I'))?$and_replacement[$matches[1]]:$matches[1];
        }
        return $and.$replacement;
    },
    $text
);

1 个答案:

答案 0 :(得分:1)

您可以将y与关键字匹配,并根据其替换它 替换的第一个字母:

$content = preg_replace_callback(
    '#( y )?{(.*?)}#', 
    function ($key) use ($agreement) {
        $and = '';
        $repl = utf8_decode($agreement[strtolower($key[2])]);
        if ( $key[1] )
            $and = in_array(substr($repl, 0, 1), array('i', 'I'))?' e ':' y ';
        return $and.$repl;
    }, 
    $content
);

所以在像这样的模板中:

{hombre} y {mujer}
{mujer} y {hombre}
sexy {mujer}

使用$agreement = array('mujer'=>'Isa', 'hombre'=>'Pedro'),这应该结束 起来:

Pedro e Isa
Isa y Pedro
sexy Isa