PHP Regex mit Klammern

  • Ich habe die folgende Zeichenfolge:

     test 13 (8) end 12 (14:48 IN 1ST)
     

    Ich brauche die Ausgabe :

     14:48 IN 1ST
     

    oder alles innerhalb der Klammern am Ende des Strings.

    Ich brauche keine 8, die sich in den ersten Klammern befindet. Die Zeichenfolge kann mehrere Sätze von Klammern enthalten. Ich muss nur alles in den letzten Klammern der Eingabezeichenfolge berücksichtigen.

    22 November 2011
    animusonSSEMember
6 answers
  • Erklärung von Regex

     .*       Go to last
    \(       Stars with (
    ([^)]*) 0 or more character except )
    \)       Ends with 
     

    preg_match

     $str = "test 13 (8) end 12 () (14:48 IN 1ST) asd";
    $regex = "/.*\(([^)]*)\)/";
    preg_match($regex,$str,$matches);
    
    $matches
    array (
      0 => 'test 13 (8) end 12 () (14:48 IN 1ST)',
      1 => '14:48 IN 1ST',
    )
     

    Leeres preg_match_all akzeptieren

     $str = "test 13 (8) end 12 () (14:48 IN 1ST) asd";
    $regex = "/\(([^)]*)\)/";
    
    preg_match_all($regex,$str,$matches);
    
    $matches
    array (
      0 => 
      array (
        0 => '(8)',
        1 => '()',
        2 => '(14:48 IN 1ST)',
      ),
      1 => 
      array (
        0 => '8',
        1 => '',
        2 => '14:48 IN 1ST',
      ),
    )
     

    Nicht akzeptieren preg_match_all

     $str = "test 13 (8) end 12 () (14:48 IN 1ST) asd";
    $regex = "/\(([^)]+)\)/";
    
    preg_match_all($regex,$str,$matches);
    
    $matches
    array (
      0 => 
      array (
        0 => '(8)',
        1 => '(14:48 IN 1ST)',
      ),
      1 => 
      array (
        0 => '8',
        1 => '14:48 IN 1ST',
      ),
    )
     
    30 September 2015
    Matthijs Wessels
  • Ich würde keine Regex dazu verwenden, das ist nicht notwendig.

    Verwenden Sie strrpos und substr , um die benötigte Zeichenfolge zu extrahieren. Es ist einfach und unkompliziert und erzielt die gewünschte Ausgabe.

    Es funktioniert, indem das letzte '(') in der Zeichenfolge gesucht wird und ein Zeichen vom Ende der Zeichenfolge entfernt wird.

     $str = "test 13 (8) end 12 (14:48 IN 1ST)";
    echo substr( $str, strrpos( $str, '(')  + 1, -1);
    
    $str = "(dont want to capture the (8)) test 13 (8) end 12 (14:48 IN 1ST)";
    echo substr( $str, strrpos( $str, '(')  + 1, -1);
     

    Demo

    Bearbeiten: Ich sollte auch beachten, dass meine Lösung in allen folgenden Fällen funktioniert:

    1. Leere Klammern
    2. Eine Reihe von Klammern (dh die Zeichenfolge vor der gewünschten Gruppierung enthält keine Klammern)
    3. Mehr als drei Sätze von Klammern (solange sich die gewünschte Gruppierung am Ende der Zeichenfolge befindet)
    4. Beliebiger Text nach der letzten Klammergruppierung (gemäß den nachstehenden Bearbeitungen)

    Endgültige Bearbeitung: Ich kann nicht genug betonen, dass die Verwendung eines Regex dazu nicht erforderlich ist. Hier ist ein Beispiel zeigt an, dass die Zeichenfolgenmanipulation 3x - 7x ist Schneller als mit einem regulären Ausdruck. .

    Gemäß den Kommentaren von MetaEd kann mein Beispiel / Code leicht geändert werden, um Text nach der letzten Klammer zu ignorieren.

     $str = "test 13 (8) end 12 (14:48 IN 1ST) fkjdsafjdsa";
    $beginning = substr( $str, strrpos( $str, '(')  + 1);
    substr( $beginning, 0, strpos( $beginning, ')')) . "\n";
     

    NOCH NOCH schneller als Regex .

    22 November 2011
    nickb
  • Am einfachsten wäre es, die Zeichenfolge in ')' aufzuteilen und dann alles vom letzten Element des resultierenden Arrays bis '(' ... '' zu ziehen. Ich weiß, es ist keine strikte Regex, aber es ist nahe genug .

    [edit] (um sicherzustellen, dass Leute, die gerne Dinge abstimmen, bevor sie wirklich verstehen, was gesagt wird ... (wie JV), tatsächlich Code haben können zu berücksichtigen) ...

     "test 13 (8) end 12 (14:48 IN 1ST)".split( /)/);
     

    Dies erzeugt ein Array mit zwei Elementen ... " test 13 (8 " und " ende 12 (14:48 IN 1ST ")

    Beachten Sie, dass Sie unabhängig davon, wie viele (xyz) Sie da haben werden endet mit dem letzten im letzten Array-Element.

    Dann durchsehen Sie das letzte Element nach einem '(') und greifen dort alles hinter sich.

    Ich vermute, dass dies schneller funktioniert als ein regulärer Regex-Ansatz, aber ich habe es nicht getestet, daher kann ich nicht garantieren, dass ... unabhängig davon, ob es funktioniert. [/ edit]

    22 November 2011
    Genia S.
  • Dieser reguläre Ausdruck bewirkt Folgendes: .+\((.+?)\)$

    Entkommen Sie die Klammern, machen Sie das Pluszeichen mit? .

    Falls nach diesem Zeichen Zeichen stehen, versuchen Sie es stattdessen:

     .\).+\((.+?)\)
     

    Dies stellt im Grunde sicher, dass nur die zweiten Klammern passen. Ich würde immer noch den ersten vorziehen.

    22 November 2011
    J V
  • \(.*\) stimmt mit der ersten und letzten Parens überein. Um dies zu verhindern, beginnen Sie mit .*, was alles bis zum letzten offenen Paran gierig verbraucht. Legen Sie dann eine Erfassungsgruppe um das, was Sie ausgeben möchten, und Sie haben:

     .*\((.*)\)
     
    22 November 2011
    MetaEd
  • Ich würde den folgenden Regex verwenden:

     .*\(([^)]+)\)
     
    22 November 2011
    DV13