2016-07-03 17 views
1

Ich bin neu in PHP und Regex, und ich stehe vor einem Problem.php reguläre Ausdrücke Gruppen

Ich habe einen Text wie dies zum Beispiel aussieht: „Vorname: sdfksdfkjskdlfjlskdf mehr Daten: dsfkskldfjsdkfjsdkf EXTRA DATEN: dsfksdfjlsdjfklsdf“

und ich mag drei Gruppen fecth, eine für VORNAMEN für mehr Daten untereinander und einem Dritte für EXTRA DATA. so ist dies mein regex:

FIRST NAME:(.*)MORE DATA:(.*)EXTRA DATA:(.*)

das ist, wie ich es in Java zu tun.

aber jetzt, wie kann ich es mit php übereinstimmen, so kann ich echo so etwas wie:

echo "more data: " . matche(group(1));

zum Beispiel.

danke!

EDIT: und was, wenn ich es wiederhole es selbst? Zum Beispiel: FIRST NAME: sdfksdfkjskdlfjlskdf MORE DATA: dsfkskldfjsdkfjsdkf EXTRA DATA: dsfksdfjlsdjfklsdf FIRST NAME: sdfksdfkjskdlfjlskdf MORE DATA: dsfkskldfjsdkfjsdkf EXTRA DATA: dsfksdfjlsdjfklsdf wie greife ich die Gruppen in einer while-Schleife, bis sie mit der Übereinstimmung übereinstimmt?

+0

immer die Struktur zufällig sein, alphanumerische Zeichen nach dem ':' in jedem Segment? Wenn dies der Fall ist, können Sie einfach 'explode' verwenden und an dem Begrenzer aufteilen, der ein Array zurückgeben würde. Wenn Sie eine bessere Kontrolle darüber brauchen, können Sie 'preg_split' – djthoms

+1

so etwas wie ** [this] (http://ideone.com/xJOd46) ** – rock321987

+0

@ rock321987 Danke! –

Antwort

1

streng auf Ihre Eingabe Basierend:

$re = "/(FIRST NAME\\s*:)\\s*(.*)(MORE DATA\\s*:\\s*)(.*)(EXTRA DATA\\s*:\\s*)(.*)/"; 
$str = "FIRST NAME: sdfksdfkjskdlfjlskdf MORE DATA: dsfkskldfjsdkfjsdkf EXTRA DATA: dsfksdfjlsdjfklsdf"; 

preg_match_all($re, $str, $matches); 

Dann $matches Variablen überprüfen. Auf diese Weise haben Sie Gruppen mit Übereinstimmungen: FIRST NAME:first-name-value, MORE DATA: more-data-value, EXTRA DATA: extra-data-value.

+0

und was, wenn ich es selbst wiederhole? Beispiel: 'VORNAME: sdfksdfkjskdlfjlskdf WEITERE DATEN: dsfkskldfjsdkfjsdkf ZUSÄTZLICHE DATEN: dsfksdfjlsdjfklsdf VORNAME: sdfksdfkjskdlfjlskdf WEITERE DATEN: dsfkskldfjsdkfjsdkf EXTRA DATA: dsfksdfjlsdjfklsdf' Wie greife ich die Gruppen in einer while-Schleife, bis sie nicht mehr übereinstimmt? –

+0

@danijinji zum Wiederholen (Erfassen von allem in einer Gruppe) einfach Surround-Muster in Klammern: https://regex101.com/r/uK8hU5/1 –

1

es uns so machen lassen:

preg_match('/FIRST NAME:\s*(.*?)\s*MORE DATA:\s*(.*?)\s*EXTRA DATA:\s*(.*)\s*/', $line, $matches); 

Ihre Spielergebnisse jetzt in $matches sein wird, wie folgt aus:

php > var_dump($matches); 
array(4) { 
    [0]=> 
    string(93) "FIRST NAME: sdfksdfkjskdlfjlskdf MORE DATA: dsfkskldfjsdkfjsdkf EXTRA DATA: dsfksdfjlsdjfklsd" 
    [1]=> 
    string(20) "sdfksdfkjskdlfjlskdf" 
    [2]=> 
    string(19) "dsfkskldfjsdkfjsdkf" 
    [3]=> 
    string(17) "dsfksdfjlsdjfklsd" 
} 
php > 

So, jetzt $matches[1] ist die erste Gruppe, und so weiter. [0] ist das Ergebnis des gesamten Matches.

0

Ihre Regex wurde entwickelt, um nur eine Übereinstimmung pro Zeile ohne Zeilenschaltung in einer Regex-Engine zu finden, da die letzte .* mit allen Zeichen 0 oder mehr übereinstimmt.

Wenn Sie Ihre Eingabe immer hat diese 3 Teile beliebig oft wiederholt werden, verwenden faul Punktanpassung und fügen Sie eine positive Vorschau nach dem letzten sicherstellen, dass wir bis zum Ende der Zeichenfolge übereinstimmen oder der FIRST NAME::

FIRST NAME:(.*?)MORE DATA:(.*?)EXTRA DATA:(.*?)(?=$|FIRST NAME:) 
      ^^^^^   ^^^^^   ^^^^^ ^^^^^^^^^^^^^^^^ 
Hier

this regex demo

Siehe, (.*?) Streichhölzer 0+ alle Zeichen außer newline als wenig wie möglich, und (?=$|FIRST NAME:) Null-Breite Behauptung erfordern .*?, um passende, was zuerst kommt: entweder Ende des Strings oder FIRST NAME:.

PHP-Anmerkung: In Java verwenden Sie Matcher#find, um Teilübereinstimmungen zu finden und eine while-Schleife auszuführen.In PHP, die Sie gerade use preg_match_all:

$re = "/FIRST NAME:(.*?)MORE DATA:(.*?)EXTRA DATA:(.*?)(?=$|FIRST NAME:)/"; 
$str = "FIRST NAME: sdfksdfkjskdlfjlskdf MORE DATA: dsfkskldfjsdkfjsdkf EXTRA DATA: dsfksdfjlsdjfklsdf FIRST NAME: sdfksdfkjskdlfjlskdf MORE DATA: dsfkskldfjsdkfjsdkf EXTRA DATA: dsfksdfjlsdjfklsdf"; 
preg_match_all($re, $str, $matches); 
print_r($matches[1]); // Print Group 1 
print_r($matches[2]); // Print Group 2 
print_r($matches[3]); // Print Group 3 

Und wenn Sie eine regex Optimierung Fan sind, entrollen die faulen passenden Gruppen:

FIRST NAME:([^M]*(?:M(?!ORE DATA:)[^M]*)*)MORE DATA:([^E]*(?:E(?!XTRA DATA:)[^E]*)*)EXTRA DATA:([^F]*(?:F(?!IRST NAME:)[^F]*)*) 

Siehe regex demo