首页 > 解决方案 > 在我不知道匹配实例数的正则表达式中替换匹配字符串中的特定字符

问题描述

我的正则表达式使用有点生疏,所以这是我目前的头条:

我有一个包含大量字段名称和值的长字符串。我已经对其进行了排序,将所有这些放入关联数组中,使用第一个条目作为我的键,第二个作为我的值等。

然而,有些值由多个条目组成,这会弄乱数组。

我的输入数据如下所示:

field_name_1|my value for 1|field_name_2|aaabbb sdsdsd|field_name_3|1232|0930|2245|field_name_4|value for 4

我通过在 | 上拆分来创建我的数组 字符,这很好用。问题是 field_name_3 的 4 位数字集也被视为我的数组中的键。

我需要做的是更换 | 就代码而言,这 4 位数字条目之间的字符和空格字符可以有效地将它们组合成一个值。

最终结果数组应包含以下内容:

  field_name_1 => my value for 1
  field_name_2 => aaabbb sdsdsd
  field_name_3 => 1232 0930 2245
  field_name_4 => value for 4

进一步说明:在这些示例之前和之后有许多字段。可以有任意数量的 4 位数字组来应用更改。

我有以下内容,它为 2 套做正确的事情,但它不能直接扩展到任何数量的套。

<?php
    
    $data = "field_name_1|value 1|field_name_2|0624|0935|field_name_3|value 3";
    
    $result = preg_replace("/(\d{4,4})\|(\d{4,4})/","$1 $2",$data);
    
    echo $result;
?>

标签: phpregex

解决方案


我会在这里使用前瞻:

$data = "field_name_1|value 1|field_name_2|0624|0935|field_name_3|value 3";
$result = preg_replace("/(\d{4})\|(?=\d{4})/", "$1 ", $data);
echo $result;

这打印:

field_name_1|value 1|field_name_2|0624 0935|field_name_3|value 3

这个想法是一次只匹配一个 4 位序列以及一个管道,用相同的数字后跟一个空格替换该匹配项。您当前模式的问题是匹配使用两组数字。所以对于以下输入:

field_name_1|value 1|field_name_2|0624|0935|1234|field_name_3|value 3

您当前的输出将是:

field_name_1|value 1|field_name_2|0624 0935|1234|field_name_3|value 3

请注意,不会更换第二个管道。


推荐阅读