Antwort an „Rolf B“ verfassen

Hallo Nico,

so, ohne größere Verletzungen von der Bergtour zurück…

Ich würde ganz einfach die Limitierung auf 3 Vorkomma- und 2 Nachkomma-Stellen aus der Regex heraus lassen, wenn dein Input Zahlen enthalten kann, die dann zu Fehltreffern führen

Die Basisregex würde dann so aussehen: /\d+([,.](\d+|--))?/

Damit findest Du beliebig lange Zahlen, mit beliebig vielen Nachkommastellen. Das ist besser, als bei zu vielen Stellen mit einer neuen Zahl zu beginnen. Die fachliche Betrachtung, ob ein Treffer von Dir verarbeitet werden soll, folgt im Nachgang.

Nehmen wir mal an, $res wäre das Ergebnisarray von preg_match_all. Per Default ist dieses Array spaltenorientiert, d.h. $res[0] enthält alle Gesamttreffer, $res[1] enthält alle Treffer für Klammergruppe 1, $res[2] alle Treffer für Klammergruppe 2, etc. Das KANN einem gefallen, muss aber nicht. Das Flag PREG_SET_ORDER liefert ein zeilenorientiertes Ergebnis: $res[0] enthält alle Infos zum ersten Match, $res[1] alle Infos zum zweiten Match, etc.

Damit Du Dir nicht merken musst, welche Klammergruppe welche Position hat, und vor allem, damit Du bei Änderungen an der Regex nicht auf einmal auf falsche Positionen zugreifst, solltest Du Klammergruppen, deren Wert du auslesen willst, benennen. Das geht mit (?'name'...). Klammergruppen, die Dich nicht interessieren, solltest Du ausblenden, das geht mit (?:...)

Mein Regex-Vorschlag sähe damit so aus:

$pattern = "/(?'vk'\d+)(?:[,.](?'nk'\d+|--))?/";
$numMatches = preg_match_all($pattern, $data, $matches, PREG_SET_ORDER);
if ($numMatches === FALSE) throw new ErrorException("Invalid Regex");

foreach ($matches as $match) {
   echo "Betrag: $match[0], Vorkomma: $match[vk], Nachkomma: $match[nk]<br>";
}

Mit diesen Teilen kannst Du nun gemütlich prüfen, ob vor oder hinter dem Komma die falsche Stellenzahl steht.

Rolf

--
sumpsi - posui - obstruxi
freiwillig, öffentlich sichtbar
freiwillig, öffentlich sichtbar
freiwillig, öffentlich sichtbar

Ihre Identität in einem Cookie zu speichern erlaubt es Ihnen, Ihre Beiträge zu editieren. Außerdem müssen Sie dann bei neuen Beiträgen nicht mehr die Felder Name, E-Mail und Homepage ausfüllen.

abbrechen