Reguläre Ausdrücke (insbesondere preg_split() PHP)

Lesezeit: 2 Minuten

Benutzer-Avatar
Konnorb

Ich liste einige Daten in meiner PHP-Anwendung auf, was zu etwas wie dem Folgenden führt:

April2016May2016June2016 usw.

Ich versuche zu verwenden preg_split um sie so zu formatieren:

array('April 2016', 'May 2016', 'June 2016')

Ich habe einen Online-Editor für reguläre Ausdrücke verwendet, um festzustellen, wie 4 aufeinanderfolgende Zahlen erkannt werden, und so weit bin ich gekommen:

Hinweis: Ich entferne auch alle Leerzeichen – idealerweise wäre es besser, wenn nur Leerzeichen entfernt würden, wenn mehr als 2 Leerzeichen vorhanden wären, dh hello world würde aber nicht geändert werden hello world möchten.

preg_split('/\d\d\d\d/g', preg_replace('!\s+!', '', $sidebar_contents));

Wenn ich das Obige verwende, erhalte ich eine Fehlermeldung, die darauf hindeutet, dass die g-Kennung nicht gültig ist, vorausgesetzt, dies ist nicht der Fall preg_match_all – Entfernen des g-Ergebnisses im Folgenden:

Geben Sie hier die Bildbeschreibung ein

Danke für jede Hilfe!

  • Hast du es versucht '~(\p{L}+)(\d+)~' mit preg_match_all?

    – Wiktor Stribiżew

    20. April 2016 um 9:23 Uhr


Benutzer-Avatar
Wiktor Stribiżew

Hier ist eine Möglichkeit, mit 1 Aufruf zu erreichen, was Sie wollen preg_match_all und mit einem array_map nach:

preg_match_all('~(\p{L}+)(\d+)~', "April2016May2016June2016", $m);
$result = array_map(function($k, $v) { return $k . " " . $v; }, $m[1], $m[2]);
print_r($result);

Siehe die Regex-Demo und ein IDEONE-Demo.

Das Muster bedeutet:

  • (\p{L}+) – Abgleich und Erfassung in Gruppe 1 (wird nach dem Abgleich über zugänglich sein $m[1]) ein oder mehrere Buchstaben
  • (\d+) – Abgleich und Aufnahme in Gruppe 2 (wird nach dem Abgleich über zugänglich sein $m[2]) eine oder mehrere Ziffern.

Mit array_mapverbinden wir einfach die Werte aus Gruppe 1 und 2 mit einem Leerzeichen.

Alternative: Füllen Sie das resultierende Array in a aus preg_replace_callback (nur ein Durchgang!):

$result = array();
preg_replace_callback('~(\p{L}+)(\d+)~', function($m) use (&$result) {
    array_push($result, $m[1] . " " . $m[2]);
}, "April2016May2016June2016");
print_r($result);

Siehe die IDEONE-Demo.

Sie können das Leerzeichen einfügen und dann teilen:

<?php
$input = "April2016May2016June2016";
var_dump(preg_split('/(?<=\d)(?!\d|$)/i',
  preg_replace('/(?<!\d)(?=\d)/', ' ', $input)));
?>

Ausgänge:

array(3) {
  [0]=>
  string(10) "April 2016"
  [1]=>
  string(8) "May 2016"
  [2]=>
  string(9) "June 2016"
}

Versuche dies:

$str = "April2016May2016June2016"; 
preg_match_all("/[a-z]+\\s\\d+/i", preg_replace("/([a-z]+)(\\d+)/i", "$1 $2", $str), $matches);
print_r($matches[0]);

Ausgabe:

Array
(
    [0] => April 2016
    [1] => May 2016
    [2] => June 2016
)

  • Warum zwei Regex-Operationen verwenden, wenn Sie mit nur einer auskommen?

    – Wiktor Stribiżew

    20. April 2016 um 9:46 Uhr

1095000cookie-checkReguläre Ausdrücke (insbesondere preg_split() PHP)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy