【发布时间】: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
);
【问题讨论】: