【问题标题】:Change previous word after replacement替换后更改前一个单词
【发布时间】:2014-03-29 13:53:00
【问题描述】:

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

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

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

示例: 通常的说法是:

伊万 y 佩德罗。

但如果第二个名字以i 开头,那么连接符就是e

佩德罗 e 伊万

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

我知道我可以进行双重处理,首先替换关键字,然后将模式 " 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
);

【问题讨论】:

    标签: php regex templates


    【解决方案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
    

    【讨论】:

    • 谢谢。毫无疑问,Isa 比 Ivan 更性感。 :) 我只是做了一些小改动,以确定原来的 y 是大写还是小写。
    猜你喜欢
    • 2010-12-15
    • 1970-01-01
    • 2019-01-31
    • 2019-04-07
    • 2015-03-02
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多