Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用preg_replace_回调函数更改数据_Php_Regex - Fatal编程技术网

Php 使用preg_replace_回调函数更改数据

Php 使用preg_replace_回调函数更改数据,php,regex,Php,Regex,我有一个文件,其中包含以下格式的数据: 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

我有一个文件,其中包含以下格式的数据:

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_回调实现这一点的方法

$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语句吗?

数学关系非常有帮助

$text = preg_replace_callback("/Group([1-5])/",function($m) {
    return chr(ord("A")+$m[1]-1);
},$text);

数学关系是一个很大的帮助

$text = preg_replace_callback("/Group([1-5])/",function($m) {
    return chr(ord("A")+$m[1]-1);
},$text);
是的:

是的:


对于这一点,另一种方法将倾向于使用 导致为找到的每个匹配项运行回调,并使用数组中的值填充匹配项

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

对于这一点,另一种方法将倾向于使用 导致为找到的每个匹配项运行回调,并使用数组中的值填充匹配项

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

整洁,我用数组写了一个答案,但这是可爱的。在编程中,这里不应该是“可爱”的地方,清晰才是美的所在。:)感谢您的帮助。整洁,我正在使用数组编写答案,但这是可爱的。在编程中,这里不应该是“可爱”的地方,清晰才是美的所在。:)感谢您的帮助。您可以使用
函数($m)use($map)
语法来代替
全局
。如果您从关联数组开始,为什么不使用更便宜的语法来执行交换呢?谢谢,我忘了这一点,您可以使用
函数($m)use($map)来代替
全局
匿名函数的语法。如果您从关联数组开始,为什么不使用更便宜的来执行交换?谢谢,我忘记了