我在變數中有一個文本塊$s:
FOO:317263
BAR:abcd
BAZ:s fsiu sfd sdf s dfsdddddd
獲得關聯陣列的最簡單方法(并具有良好的決議性能)是什么:
$a = array('FOO' => '317263', 'BAR' => 'abcd', 'BAZ' => 's fsiu sfd sdf s dfsdddddd');
?
到目前為止,我使用過:
preg_match("/^FOO:(.*)$/m", $s, $matches1);
$a['FOO'] = $matches1[1];
preg_match("/^BAR:(.*)$/m", $s, $matches1);
$a['BAR'] = $matches1[1];
...
但是有沒有更簡單的方法來做到這一點?
uj5u.com熱心網友回復:
您真的可以使用非正則運算式方法,例如
$s = 'FOO:317263
BAR:abcd
BAZ:s fsiu sfd sdf s dfsdddddd';
$a = array();
foreach (explode("\n", $s) as $line) {
$chnk = explode(':', $line, 2);
$a[$chnk[0]] = $chnk[1];
}
print_r($a);
用 LF 拆分后,explode(':', $line, 2);用于拆分第一次出現冒號的行。
如果您可以有不同/混合的行尾,請替換explode("\n", $s)為preg_split('~\R ~', $s)或者即使preg_split('~\R ~u', $s)您處理 Unicode。
如果你知道你需要做一些比你在問題中透露的更多的匹配,并且你真的需要一個正則運算式,你可以考慮
$a = array();
if (preg_match_all('~^(\w )\h*:\h*(. )~m', $s, $matches)) {
$a = array_combine($matches[1],trim($matches[2]));
}
print_r($a);
請參閱PHP 演示和正則運算式演示。詳情:
^- 一行的開始(由于m標志)(\w )- 第 1 組:一個或多個單詞字符\h*:\h*- 用零個或多個水平空格包圍的冒號(. )- 第 2 組:該行的其余部分。
您還可以使用parse_ini_string:
$a = parse_ini_string(preg_replace('/^([^:\v]*):(.*)/m', '$1=\'$2\'', $s), FALSE);
請參閱此 PHP 演示。
該preg_replace('/^([^:\v]*):(.*)/m', '$1=\'$2\'', $s)部分用 a 替換:每行上的所有第一個字符,用單引號=將第一個后面的部分包裝:起來(以便parse_ini_string正確處理額外的=s),并parse_ini_string獲取鍵和值的陣列。
uj5u.com熱心網友回復:
如果保證':'右邊的值不包含':'或“\n”:
$s = <<< STRING
FOO:317263
BAR:abcd
BAZ:s fsiu sfd sdf s dfsdddddd
STRING;
$arr = array_column(array_chunk(preg_split("/[:\n]/", $s), 2), 1, 0);
print_r($arr);
這將列印:
Array
(
[FOO] => 317263
[BAR] => abcd
[BAZ] => s fsiu sfd sdf s dfsdddddd
)
uj5u.com熱心網友回復:
從您的字串構建一個流并將其作為 csv 讀取:
$s = <<<'DATA'
FOO:317263
BAR:abcd
BAZ:s fsiu sfd sdf s df:sdddddd
DATA;
$handle = fopen("data://text/plain,$s",'r');
$result = [];
while (false !== $cols = fgetcsv($handle, 4096, ':')) {
$result[array_shift($cols)] = implode(':', $cols);
}
print_r($result);
總是使用流,但更“實用”:
$result = array_reduce(file("data://text/plain,$s"), function($c,$i) {
[$k, $v] = explode(':', $i, 2);
$c[$k] = rtrim($v);
return $c;
}, $c=[]);
print_r($result);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/375238.html
