Php 替换后更改上一个单词

Php 替换后更改上一个单词,php,regex,templates,Php,Regex,Templates,我有一个模板系统,用数据库中相应的值替换花括号内的每个关键字 示例:公司和机构同意 问题是有些模板是西班牙语的,并且有一条规则规定,当单词以字母iprevious开头时,“connector ise而不是y” 例如: 通常的说法是: 伊凡y佩德罗 但如果第二个名称以i开头,则连接器为e 佩德罗eIván 我需要找到一种方法来进行这些替换,以便获得准确的文档 我知道我可以做双重处理,首先替换关键字,然后用“ei”替换模式“yi”,但我不确定这是否是解决此问题的最佳方法 我用于替换的代码如下所示:

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

示例:公司和机构同意

问题是有些模板是西班牙语的,并且有一条规则规定,当单词以字母
i
previous开头时,“connector is
e
而不是
y

例如: 通常的说法是:

伊凡y佩德罗

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

佩德罗eIván

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

我知道我可以做双重处理,首先替换关键字,然后用
“ei”
替换模式
“yi”
,但我不确定这是否是解决此问题的最佳方法

我用于替换的代码如下所示:

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

您可以将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

非常感谢。毫无疑问,伊莎比伊凡性感我只是做了一些小改动,以确定原始的
y
是大写还是小写。