我有了下一个包含数据的数组(它是动态生成的(。现在我想做一些魔术和调整阵列。
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
)