我有一个字符串:
$string = 'A0695/16 NOTAMN Q) EHAA/QARLT/I /NBO/E /000/999/5155N00430E073 A) EHAA B) 1605260001 C) 1608260900 EST E) REF AIP NETHERLANDS ENR 3.2 UT601 ADD TO ROUTE REMARKS: NOT AVBL FOR TRAFFIC DEP/ARR ETNG, EDDK AND ETNN DURING THE OPENING OF EHEH 0600-2300 (0500-2200). THESE FLIGHTS WILL HAVE TO REROUTE.';
我想把这个字符串拆分成一个关联数组。
$result['Q)'] = 'EHAA/QARLT/I /NBO/E /000/999/5155N00430E073';
$result['A)'] = 'EHAA';
$result['B)'] = '1605260001';
$result['C)'] = '1608260900 EST';
等等。
我设法用将其放入阵列中
$result = preg_split("/.')/", $string);
它给了我一个数组,但我需要密钥是'a)', 'b)'
等
有人能帮我吗?
使用具有特定regexp模式的preg_match_all
函数(命名子任务(和array_combine
函数(以获得各自的键/值对(的解决方案:
$string = 'A0695/16 NOTAMN Q) EHAA/QARLT/I /NBO/E /000/999/5155N00430E073 A) EHAA B) 1605260001 C) 1608260900 EST E) REF AIP NETHERLANDS ENR 3.2 UT601 ADD TO ROUTE REMARKS: NOT AVBL FOR TRAFFIC DEP/ARR ETNG, EDDK AND ETNN DURING THE OPENING OF EHEH 0600-2300 (0500-2200). THESE FLIGHTS WILL HAVE TO REROUTE.';
preg_match_all("/(?<k>[A-Z]')) (?<v>.+?)(?= [A-Z]')|$)/", $string, $matches);
// 'k'/'v' are key/value
$result = array_combine($matches['k'], $matches['v']);
print_r($result);
输出:
Array
(
[Q)] => EHAA/QARLT/I /NBO/E /000/999/5155N00430E073
[A)] => EHAA
[B)] => 1605260001
[C)] => 1608260900 EST
[E)] => REF AIP NETHERLANDS ENR 3.2 UT601 ADD TO ROUTE REMARKS: NOT AVBL FOR TRAFFIC DEP/ARR ETNG, EDDK AND ETNN DURING THE OPENING OF EHEH 0600-2300 (0500-2200). THESE FLIGHTS WILL HAVE TO REROUTE.
)
愚蠢格式的另一个愚蠢解决方案,因为为什么不呢。
$string = 'A0695/16 NOTAMN Q) EHAA/QARLT/I /NBO/E /000/999/5155N00430E073 A) EHAA B) 1605260001 C) 1608260900 EST E) REF AIP NETHERLANDS ENR 3.2 UT601 ADD TO ROUTE REMARKS: NOT AVBL FOR TRAFFIC DEP/ARR ETNG, EDDK AND ETNN DURING THE OPENING OF EHEH 0600-2300 (0500-2200). THESE FLIGHTS WILL HAVE TO REROUTE.';
$foo = preg_split('/([A-Z]')) /', $string, 0, PREG_SPLIT_DELIM_CAPTURE);
$ret = [];
foreach (range(1, count($foo) - 1, 2) as $i)
{
$ret[$foo[$i]] = $foo[$i + 1];
}
print_r($ret);
打印:
Array (
[Q)] => EHAA/QARLT/I /NBO/E /000/999/5155N00430E073
[A)] => EHAA
[B)] => 1605260001
[C)] => 1608260900 EST
[E)] => REF AIP NETHERLANDS ENR 3.2 UT601 ADD TO ROUTE REMARKS: NOT AVBL FOR TRAFFIC DEP/ARR ETNG, EDDK AND ETNN DURING THE OPENING OF EHEH 0600-2300 (0500-2200). THESE FLIGHTS WILL HAVE TO REROUTE. )
与其说是高效,不如说是异想天开:
$p = preg_split('~(?<!'S)([A-Z]'))'s+~', $string, -1, PREG_SPLIT_DELIM_CAPTURE);
$result = [];
if (count($p) > 1) {
unset($p[0]);
while($p) {
$result[array_shift($p)] = array_shift($p);
}
}
print_r($result);