基于正则表达式替换数组中的数据



我有了下一个包含数据的数组(它是动态生成的(。现在我想做一些魔术和调整阵列。

array(1) {
["table"]=>
array(3) {
["header"]=>
array(4) {
[0]=>
array(1) {
["c"]=>
string(4) "Naam"
}
[1]=>
array(1) {
["c"]=>
string(7) "Functie"
}
[2]=>
array(1) {
["c"]=>
string(13) "Nevenfuncties"
}
[3]=>
array(1) {
["c"]=>
string(34) " commissies"
}
}
["caption"]=>
bool(false)
["body"]=>
array(3) {
[0]=>
array(4) {
[0]=>
array(1) {
["c"]=>
string(16) "*|class:orange|*"
}
[1]=>
array(1) {
["c"]=>
string(6) "dsasad"
}
[2]=>
array(1) {
["c"]=>
string(0) ""
}
[3]=>
array(1) {
["c"]=>
string(0) ""
}
}
[1]=>
array(4) {
[0]=>
array(1) {
["c"]=>
string(4) "brrr"
}
[1]=>
array(1) {
["c"]=>
string(6) "adsdsa"
}
[2]=>
array(1) {
["c"]=>
string(0) ""
}
[3]=>
array(1) {
["c"]=>
string(0) ""
}
}
[2]=>
array(4) {
[0]=>
array(1) {
["c"]=>
string(6) "dsasad"
}
[1]=>
array(1) {
["c"]=>
string(6) "dsadas"
}
[2]=>
array(1) {
["c"]=>
string(4) "dsad"
}
[3]=>
array(1) {
["c"]=>
string(0) ""
}
}
}
}
}

当我们查看["标头"]时,它包含["c"](单元格数据(。这可以是文本,也可以是标签。例如:*|class:orange|* here some text

现在,如果['c']包含'|class:orange|',我想将其拆分并覆盖它。所以当你有这个:

array(1) {
["c"]=>
string(7) "*|class:orange|* hello"
}

它会变成这样:

array(2) {
["c"]=>
string(7) "hello",
["class"]=>
string(7) "orange",
}

通过这种方式,我可以拆分类并将其添加到数组中。但我被困在赛前。

foreach ($table as &$row) {
foreach ($row['header'] as &$header) {
//        $header['class'] = 123;
preg_match('/*|class:([^|])|*/', $header['c'], $matches);
}
}

我需要做两件事

  • 将一个属性添加到数组($header['class'](,并在类之后添加类:example
  • 我需要替换$header['c'],这样它就不包含*|class:orange|*,只包含文本的其余部分

还不需要regexp。可以找到带有分隔符定位的标签:

foreach ($row['header'] as &$header) {
$str = $header['c'];
$tagged = substr($str, 0, 2) === '*|' && $pos = strpos($str, '|* ');
if (!$tagged) { continue; }
[$tag, $value] = explode(':', substr($str, 2, $pos - 2));
$header['c']  = substr($str, $pos + 3);
$header[$tag] = $value;
}

例如,您可以使用2个捕获组,并将它们用作c和new class键的值。

对于第二个捕获组,您可以确保使用S至少匹配一个非空白字符

请注意,重复字符类1次或多次,并且不必转义字符类中的管道。

*|class:([^|]+)|*h*(S.*)

或者,如果第2组的以下内容可以是可选的:

*|class:([^|]+)|*h*(.*)

Regex演示

解释第一模式

  • *|匹配*|
  • class:按字面匹配
  • ([^|]+)捕获组1,匹配除|之外的任何字符的1+倍
  • |*h*匹配后面跟有0+个水平空白字符的|*
  • (S.*)捕获组2,匹配非空白字符和0倍以上除换行符以外的任何字符

Regex演示| Php演示

示例代码

$array = [
"c" => "*|class:orange|* hello"
];
$pattern = "~*|class:([^|]+)|*h*(S.*)~";
foreach ($array as $key => $string) {
if (preg_match($pattern, $string, $matches)) {
$array[$key] = $matches[2];
$array["class"] = $matches[1];
}
}
print_r($array);

输出

Array
(
[c] => hello
[class] => orange
)

最新更新