使用数组和foreach循环从另一个中获取String

med*_*edk 0 php arrays foreach explode

我想从另一个地方创建一个字符串:

1-第一个字符串是:"4-3 | 5-2 | 9-6 | 7-1 | 2-8"

2-新字符串必须是:"4,5,9,7,2"

我有这段代码,但它不起作用:

$string_1 = '4-3|5-2|9-6|7-1|2-8';

$array_1 = explode('|', $string_1);

$string_2 = '';

foreach ( $array_1 as $item ) {

    $array_2 = explode('-', $item);

    foreach ( $array_2 as $item_id => $item_value ) {

        $string_2 .= ($string_2 == '') ? $item_id : ', ' . $item_id;

    }

}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ter 7

如何使用RegEx执行此任务?

使用正则表达式的代码:

$string_1 = '4-3|5-2|9-6|7-1|2-8';
preg_match_all('/(\d+)-\d+\|?/',$string_1,$matches);
$string_2 = implode(", ", $matches[1]);
Run Code Online (Sandbox Code Playgroud)

演示

它比循环遍历字符串的每个字符更有效.


正则表达式解释说:

正则表达式可视化为RailRoad图: 正则表达式

  • (\d+):第一个\d匹配一个数字.这+意味着一次或多次.它()周围创建了一个组,这意味着匹配将存储在$matches数组中
  • -:紧接着简单的破折号
  • \d+:然后再出现一次或多次数字
  • \|?:和一个管道角色\|(需要转义).这?意味着只有一个或没有管道.

然后,preg-match-all将搜索给定字符串中的所有可能(重复)匹配.

  • 虽然这可能有效,但它无法帮助人理解如何解决这些问题,因为正则表达式是*不透明*.:)也许包括有关你的正则表达式如何工作的解释. (2认同)