2010-03-01 14 views

Odpowiedz

27

[oraz] są znakami specjalnymi w wyrażeniu regularnym. Służą do wyświetlania znaków z meczu. [a-z] dopasowuje każdą małą literę między "a" i "z". [03b] dopasowuje "0", "3" lub "b". Aby dopasować znaki "[" i "]", musisz uciec przed nimi z poprzedzającym \.

Twój kod mówi "zastąp dowolny znak [](). pustym łańcuchem" (zmiana kolejności od kolejności, w której zostały wpisane dla jasności).


Chciwy dopasowania:

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

Chciwy mecz pasowały wielu [S i S]. To wyrażenie zajmie an example [of "sneaky"] text [with more "sneaky"] here i zmieni go w an example here.


Perl ma składnię dla non-chciwych meczu (najprawdopodobniej nie chcą być chciwym):

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

dla chciwych mecze Spróbuj złapać jak kilka znaków, jak to możliwe. Na tym samym przykładzie: an example [of "sneaky"] text [with more "sneaky"] here staje się an example text here.


tylko do pierwszego poniżej]:

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

Jest to bardziej wyraźne, ale trudniejsze do odczytania. Używając tego samego przykładowego tekstu, uzyskasz wynik nieagrypcyjnego wyrażenia.


Należy zauważyć, że żadna z nich nie zajmuje się wyraźnie białym odstępem. Przestrzenie po obu stronach [i] pozostaną.

Należy również pamiętać, że wszystkie te mogą się nie udać w przypadku zniekształconego wejścia. Wielokrotne [s i] s bez dopasowań może spowodować zaskakujący wynik.

+0

Bardzo dziękuję za wyjaśnienie! –

+0

Hmm, wadliwe wejście to coś, na co mogę wpaść. Czy można obsłużyć przypadek braku dopasowania]? –

+0

Musiałbym wiedzieć, jak chcesz to zrobić. Co miałbyś nadzieję, że zrobi to ze zniekształconym wejściem? –

1

Chyba rzeczywiście chcesz parens dla swoich zewnętrznych wsporników, ponieważ jest to grupa. nawiasy kwadratowe to zakres wyrażeń. Nie wiem, jak go wpisać w SO.

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

wszelki wypadek szukasz rekurencyjnego usuwania:

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

To będzie przekonwertować to:

Ten [tekst [więcej tekstu]] jest cool

do to:

Th jest fajny

Powiązane problemy