2009-03-14 8 views
2

Ich habe ein Skript, wo ich drei Teile aus einer Textzeichenfolge abrufen und sie in einem Array zurückgeben muss. Nach ein paar Versuchen und Versagen konnte ich es nicht zur Arbeit bringen.Kannst du mir helfen, diesen regulären Ausdruck zu machen?

Die Textzeichenfolgen können wie folgt aussehen:

{Some place} ({often text in parenthesis}) [{even text i brackets sometimes}]

Welche zurückkehren sollte:

1: Some place 
2: often text in parenthesis 
3: even text in brackets sometimes

weiß ich, das sollte

Some place 
Some place (often text in parenthesis) 
Some place (often text in parenthesis) [even text in brackets sometimes]

ich diese Strings in drei aufteilen müssen sei eine leichte Aufgabe, aber ich konnte den korrekten regulären Ausdruck nicht lösen. Dies soll in PHP verwendet werden.

Vielen Dank im Voraus!

+0

Kommen Klammern und Klammern immer in der gleichen Reihenfolge vor? –

Antwort

2

so etwas wie dieses Versuchen:

$result = preg_match('/ 
^([^(]+?) 
    (\s* \(([^)]++) \))? 
    (\s* \[ ([^\]]++) \])? 
    \s* 
    $/x', $mystring, $matches); 

print_r($matches); 

Beachten Sie, dass in diesem Beispiel, werden Sie wahrscheinlich am meisten interessieren $ matches [1], $ treffer [3], $ treffer [5].

+0

Arbeitete wie ein Charme! Vielen Dank! –

1

Teilen Sie das Problem in drei reguläre Ausdrücke auf. Nach dem ersten, wo Sie jedes Zeichen vor der ersten Klammer erhalten, speichern Sie Ihre Position - genauso wie die Länge der Zeichenfolge, die Sie gerade extrahiert haben.

Dann in Schritt zwei, das gleiche tun, aber packen alles bis zur schließenden Klammer. (Verschachtelte Klammern machen dies etwas komplizierter, aber nicht zu sehr.) Speichern Sie erneut einen Zeiger auf das Ende der zweiten Zeichenfolge.

Die dritte Zeichenfolge ist dann trivial.

1

Ich würde es wahrscheinlich als drei regulären Ausdrücken tun, beginnend mit Klammern und Klammer, und fallen auf weniger Elemente zurück, wenn das fehlschlägt.

^(.*?)\s+\((.*?)\)\s+\[(.*?)\]\s+$ 

wenn es scheitert dann versuchen:

^(.*?)\s+\((.*?)\)\s+$ 

wenn das nicht klappt auch versuchen:

^\s+(.*?)\s+$ 

Ich bin sicher, können sie in einem regulären Ausdruck kombiniert werden, aber ich wouldn‘ t versuchen.

1

So ähnlich?

([^(]++)(?: \(([^)]++)\))?(?: \[([^\]]++)\])? 
Verwandte Themen