Änderung des Verhaltens von preg_match_all in PHP
Mit dem vierten Parameter der Funktion preg_match_all
kann die Art der Gruppierung der Erfassungsgruppen geändert werden.
Lassen Sie uns sehen, welche Werte dieser Parameter annehmen kann:
| Parameter | Beschreibung |
|---|---|
PREG_PATTERN_ORDER |
Standardmodus. Die Ergebnisse werden nach Erfassungsgruppen gruppiert - das nullte Element des Arrays enthält die nullten Erfassungsgruppen, das erste Element des Arrays enthält die ersten Erfassungsgruppen und so weiter. |
PREG_SET_ORDER |
Die Ergebnisse werden nach Übereinstimmungen gruppiert - jedes Element des Arrays enthält ein Array mit den gefundenen Erfassungsgruppen. |
Sehen wir uns nun die Verwendung dieses Parameters an Beispielen an:
Beispiel
Extrahieren wir alle Zeitstempel aus der Zeichenkette und ihre Komponenten:
<?php
$time = '12:01:02 13:03:04 14:05:06';
preg_match_all('#(\d\d):(\d\d):(\d\d)#', $time, $res);
print_r($res);
?>
Ergebnis der Codeausführung:
[
0 => ['12:01:02', '13:03:04', '14:05:06'],
1 => ['12', '13', '14'],
2 => ['01', '03', '05'],
3 => ['02', '04', '06']
]
Beispiel
Verwenden wir nun das Flag PREG_SET_ORDER
für die Gruppierung nach Übereinstimmungen:
<?php
$time = '12:01:02 13:03:04 14:05:06';
preg_match_all('#(\d\d):(\d\d):(\d\d)#', $time, $res, PREG_SET_ORDER);
print_r($res);
?>
Ergebnis der Codeausführung:
[
0 => '12:01:02',
1 => '12',
2 => '01',
3 => '02'
],
[
0 => '13:03:04',
1 => '13',
2 => '03',
3 => '04'
],
[
0 => '14:05:06',
1 => '14',
2 => '05',
3 => '06'
]
Praktische Aufgaben
Gegeben ist eine Zeichenkette mit Datumsangaben:
<?php
$str = '2023-10-29 2024-11-30 2025-12-31';
?>
Finden Sie alle Datumsangaben, indem Sie Jahr, Monat und Tag in separate Erfassungsgruppen trennen. Sorgen Sie dafür, dass in das erste Unterarray das erste Datum mit seinen Erfassungsgruppen gelangt, in das zweite Unterarray - das zweite mit seinen Erfassungsgruppen und so weiter.