我有一个包含以下格式的数据的文件:
0101 Group1 01/13/13
0102 Group1 02/03/13
0103 Group1 03/05/13
0104 Group1 04/05/13
0201 Group2 04/19/13
0202 Group2 05/10/13
0301 Group3 07/13/13
0302 Group3 07/13/13
0303 Group3 07/13/13
0401 Group4 02/12/13
0501 Group5 05/29/13
我只有5
组。我想在这里用单个字母值替换每个组。
Group1 will be replaced with A
Group2 will be replaced with B
Group3 will be replaced with C
Group4 will be replaced with D
Group5 will be replaced with E
我找到了使用preg_replace_callback执行此操作的方法。
$text = preg_replace_callback('/Group[1-5]/', 'id_callback', $text);
function id_callback($matches) {
if ($matches[0] == 'Group1') {
return 'A';
} elseif ($matches[0] == 'Group2') {
return 'B';
} elseif ($matches[0] == 'Group3') {
return 'C';
} elseif ($matches[0] == 'Group4') {
return 'D';
} elseif ($matches[0] == 'Group5') {
return 'E';
}
}
echo $text;
有没有办法可以做到这一点并摆脱所有这些if语句?
答案 0 :(得分:2)
数学关系是一个很好的帮助。
$text = preg_replace_callback("/Group([1-5])/",function($m) {
return chr(ord("A")+$m[1]-1);
},$text);
答案 1 :(得分:1)
是:
$find = array('Group1', 'Group2', 'Group3', 'Group4', 'Group5');
$replace = array('A', 'B', 'C', 'D', 'E');
$result = str_replace($find, $replace, $string);
答案 2 :(得分:1)
对此采用不同的方法会使associative array
使用anonymous/named
函数
导致为它找到的每个匹配运行回调,并使用数组中的值填充匹配。
$map = array('Group1' => 'A', 'Group2' => 'B',
'Group3' => 'C', 'Group4' => 'D', 'Group5' => 'E');
$text = preg_replace_callback('/(?P<id>Group[1-5])/',
function($m) {
global $map;
extract($m);
return isset($map[$id]) ? $map[$id] : $m[0];
}, $text);
注意:我将正则表达式替换为Named capturing Group以获取可读性。
<强>更新强>
正如@Niet the Dark Absol所述,这是使用strtr替换来执行此操作的简单方法。
$text = _replace($text);
function _replace($t) {
$map = array('Group1' => 'A', 'Group2' => 'B',
'Group3' => 'C', 'Group4' => 'D', 'Group5' => 'E'
);
return strtr($t, $map);
}