2010-03-01 8 views

Antwort

27

[und] sind Sonderzeichen in einer Regex. Sie werden verwendet, um Charaktere eines Spiels aufzulisten. [a-z] passt jeden Kleinbuchstaben zwischen "a" und "z". [03b] entspricht einer "0", "3" oder "b". Um die Zeichen "[" und "]" abzugleichen, müssen Sie sie mit einem vorangestellten \ entschlüsseln.

Ihr Code sagt derzeit "ersetzen Sie ein beliebiges Zeichen von [](). mit einer leeren Zeichenfolge" (Reihenfolge aus der Reihenfolge, in der Sie sie aus Gründen der Klarheit eingegeben).


Greedy Spiel:

preg_replace('/\[.*\]/', '', $str); // Replace from one [ to the last ] 

Ein gieriges Spiel mehr [s und] s passen könnte. Dieser Ausdruck würde nehmen und in umwandeln.


Perl hat eine Syntax für eine nicht gierige Spiel (Sie wahrscheinlich nicht wollen, gierig sein):

preg_replace('/\[.*?\]/', '', $str); 

Nicht gierig Matches versuchen, so wenig Zeichen wie möglich zu fangen. Mit demselben Beispiel: wird an example text here.


nur bis zum ersten folgenden]:

preg_replace('/\[[^\]]*\]/', '', $str); // Find a [, look for non-] characters, and then a ] 

Dies ist deutlicher, aber schwieriger zu lesen. Mit demselben Beispieltext erhalten Sie die Ausgabe des nicht-gierigen Ausdrucks.


Beachten Sie, dass keiner von diesen explizit mit Leerzeichen behandelt. Die Leerzeichen auf beiden Seiten von [und] bleiben erhalten.

Beachten Sie auch, dass alle diese für fehlerhafte Eingabe fehlschlagen können. Mehrere [s und] s ohne Übereinstimmungen können zu einem überraschenden Ergebnis führen.

+0

Vielen Dank für die Erklärung! –

+0

Hmm, die missgebildete Eingabe ist etwas, in das ich hineinlaufen könnte. Ist es möglich, mit der Instanz umzugehen, die kein Matching hat?] –

+0

Ich müsste wissen, wie Sie es handhaben wollen. Was würden Sie mit falschem Input erwarten? –

1

Ich glaube, Sie tatsächlich Pars für Ihre äußere Klammern wollen, da es sich um eine Gruppe ist. eckige Klammern sind eine Reihe von Ausdrücken. Nicht sicher, wie man es in SO eintippt.

/(\\[.*\\])/ 
6

Gerade falls Sie für eine rekursive Entfernung suchen:

$str = preg_replace("/\[([^\[\]]++|(?R))*+\]/", "", $str); 

, dass dies konvertieren:

Dieser [text [] mehr Text] cool

zu dieses:

Th ist cool