PHP Regex mit Klammern
Habe ich die unten string:
test 13 (8) end 12 (14:48 IN 1ST)
Brauche ich die Ausgabe:
14:48 IN 1ST
oder alles innerhalb der Klammern in Richtung der das Ende der Zeichenfolge.
Brauche ich nicht, 8, die in der ersten Reihe von Klammern. Es können mehrere Sätze von Klammern in einem string. Ich brauche nur zu betrachten, alles innerhalb der letzten Reihe von Klammern der input-string.
Beachten Sie, dass
Klammern sind sehr oft als Runde Klammern, auch.
Ist das eine regionale Sache? Ich habe noch nie gehört, so ein Begriff.
Ich habe immer vermutet, es entstand außerhalb der USA, da habe ich nur gemerkt es in Programmierung-Foren. Es scheint eher angebracht, in diesem Zusammenhang sowieso, da wir nicht mit Ihnen wie Satz Satzzeichen. Sie sind nur Klammern, die zufällig Runde.
{}
sind in der Regel bezeichnet als geschweifte Klammern (oder Klammern). []
ist Klammern oder eckigen Klammern, und was Sie haben, sind Klammern.Klammern sind sehr oft als Runde Klammern, auch.
Ist das eine regionale Sache? Ich habe noch nie gehört, so ein Begriff.
Ich habe immer vermutet, es entstand außerhalb der USA, da habe ich nur gemerkt es in Programmierung-Foren. Es scheint eher angebracht, in diesem Zusammenhang sowieso, da wir nicht mit Ihnen wie Satz Satzzeichen. Sie sind nur Klammern, die zufällig Runde.
InformationsquelleAutor user1058797 | 2011-11-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Regex-Erklärung
preg_match
Akzeptieren, Leer preg_match_all
Nicht Akzeptieren, Leere preg_match_all
Antwort aktualisiert.
Dies ist in der Nähe; preg_match_all() gibt alle Teil-Gruppen. Der OP will die Letzte nur. Schlage vor, Sie ändern die Lösung für die Rückkehr der letzten Gruppe.
Ich fügte hinzu, preg_match nur zu
+1 Diese Antwort ist eine gute Antwort, wenn ein regex verwendet werden muss. Ansonsten verwenden Sie string-manipulation.
InformationsquelleAutor Utku Yıldırım
Ich würde nicht mit einem regex für diese, es ist unnötig.
Verwenden strrpos und substr zu extrahieren, den string, den Sie brauchen. Es ist einfach, unkompliziert und erreicht die gewünschte Ausgabe.
Funktioniert es, indem der Letzte '(' in der Zeichenfolge, und das entfernen eines dieser Zeichen vom Ende der Zeichenfolge.
Demo
Edit: ich sollte auch beachten, dass meine Lösung funktioniert für alle folgenden Fällen:
Letzte änderung: Wieder, ich kann mich nicht Wert genug, dass mit einer regex für diese unnötig ist. Hier ist ein Beispiel zeigen, dass string-manipulation ist 3x - 7x schneller als ein regex.
Als pro MetaEd die Kommentare in meinem Beispiel /code kann problemlos geändert werden ignoriert text nach der letzten Klammer.
Immer NOCH schneller als ein regex.
OP ausdrücklich gebeten, für eine regex.
So? Die Leute kommen, um SO zu lernen, neue Methoden, um Ihre Ziele zu erreichen, von denen einige nicht wirklich wissen, was Sie wollen. Nur weil Sie gefragt eine regex bedeutet das nicht das ist, was Sie sollte verwenden. Nicht zu erwähnen, dass ein downvote impliziert, dass die Antwort nicht hilfreich, ich denke, wir können beide einig, dass dies nicht der Fall ist.
Fair genug, aber in diesem Fall schlage ich vor, überarbeiten Sie Ihre Lösung und die Möglichkeit der text nach der letzten schließenden Klammer. Es ist keiner in dem Beispiel, aber es ist nicht ausgeschlossen, durch die problem-und Verlustrechnung, die darauf hinauslaufen, dass "alles innerhalb der letzten Reihe von Klammern der input-string".
+1 für rechts und downvoted. 🙂
InformationsquelleAutor nickb
Ich würde mit dem folgenden regex:
InformationsquelleAutor DV13
\(.*\)
wird mit dem ersten und letzten parens. Um das zu verhindern, beginnen Sie mit.*
die gierig konsumieren, alles bis zu der letzten offenen Klammer. Dann legen Sie eine capture-Gruppe um das, was Sie ausgeben möchten, und Sie haben:\(.*\)
passt alles von der ersten(
den letzten)
.Ja. Ich habe den Fehler behoben in meiner Beschreibung, dass ein Teil des Ausdrucks.
InformationsquelleAutor MetaEd
Dieser regex tun:
.+\((.+?)\)$
Flucht der Klammern, machen Sie die + nicht-gierige ?, und stellen Sie sicher, dass es am Ende der Zeile.
Wenn es gibt Zeichen, nachdem Sie es, versuchen Sie dies statt:
Was im Grunde stellt sicher, dass nur die zweiten Klammern übereinstimmen. Ich würde immer noch lieber die erste.
Rechts -, kratz-Zahl 2, aber Nummer 1 noch funktioniert, wenn es keine Leerzeichen oder anderen Müll am Ende.
Richtig, aber ich denke, Sie sind auf dem richtigen Weg mit Ihrer Nummer 2, weil die Problemstellung nicht auszuschließen, text nach dem letzten Satz von Klammern.
Auch wenn Sie davon ausgehen, die Zeichenfolge endet mit
)
so funktioniert das nicht.\((.+?)\)$
noch startet matching bei der ersten(
; die nicht-gierige Quantifizierer nicht ändern. In der Tat, wenn Sie entfernt die$
es würde mit der erste setzen der Klammern. Wie es ist, du wirst alles bekommen, was von der ersten(
den letzten)
.Richtig, ursprünglich hatte ich einen .+ vor der, lassen Sie mich-stick zurück...
InformationsquelleAutor J V
Ist die einfachste Sache wäre aufteilen der Zeichenfolge ')' und dann schnapp dir einfach alles vom letzten Element in dem resultierenden array bis '('... ich weiß, es ist nicht unbedingt regex, aber es ist nah genug.
[Bearbeiten]
(um sicherzustellen, dass Menschen, die Liebe zu down-vote Dinge, bevor Sie tatsächlich verstehen, was gesagt wird... (wie JV), können den tatsächlichen code zu prüfen)...
Daraus wird ein array mit zwei Elementen...
"test 13 (8"
und
"Ende des 12 (14:48 1."
Beachten, dass, egal wie viele (xyz) du drin hast, wirst du am Ende mit der letzten in das Letzte array-Element.
Dann haben Sie gerade den Blick durch das Letzte Element, das für eine '(' und wenn Sie da ist greifen alles hinter sich.
Ich vermute, dies wird die Arbeit schneller als eine gerade regex-Ansatz, aber habe ich noch nicht getestet, kann also nicht garantieren, dass... egal, es funktioniert.
[/edit]
InformationsquelleAutor Genia S.