Mam ciąg, który wygląda tak:
[if-abc] 12345 [if-def] 67890 [/ if] [/ if]
Mam następujące wyrażenie regularne:
/[if-([a-z0-9-]*)]([^[if]*?)[/if]/s
Dopasowuje to wewnętrzne nawiasy, tak jak tego chcę. Jednak, gdy zamieniam 67890 na tekst (np. Abcdef), to nie pasuje do niego.
[if-abc] 12345 [if-def] abcdef [/ if] [/ if]
Chcę móc dopasować DOWOLNE znaki, w tym podziały wierszy, z wyjątkiem innego nawiasu otwierającego [if-
.
Odpowiedzi:
1 dla odpowiedzi № 1Ta część nie działa tak, jak myślisz:
[^[if]
Spowoduje to dopasowanie pojedynczego znaku, który nie jest żadnym z nich [
, i
lub f
. Niezależnie od kombinacji. Możesz naśladować pożądane zachowanie za pomocą a ujemna liczba oczekujących chociaż:
~[if-([a-z0-9-]*)]((?:(?![/?if).)*)[/if]~s
Uwzględniłem też zamykanie znaczników w widoku do przodu,ponieważ pozwala to uniknąć powtarzania nieznajomości (co zwykle jest gorsze pod względem wydajności). Dodatkowo, zmieniłem separatory, abyś nie musiał uciec z ukośnika we wzorcu.
To jest interesująca część ((?:(?![/?if).)*)
wyjaśnione:
( # capture the contents of the tag-pair
(?: # start a non-capturing group (the ?: are just a performance
# optimization). this group represents a single "allowed" character
(?! # negative lookahead - makes sure that the next character does not mark
# the start of either [if or [/if (the negative lookahead will cause
# the entire pattern to fail if its contents match)
[/?if
# match [if or [/if
) # end of lookahead
. # consume/match any single character
)* # end of group - repeat 0 or more times
) # end of capturing group
0 dla odpowiedzi nr 2
Modyfikowanie trochę wyników:
/[if-([a-z0-9-]+)](.+?)(?=[if)/s
Uruchomienie go [if-abc] 12345 [if-def] abcdef [/if][/if]
Wyniki w pierwszym meczu: [if-abc] 12345
Twoje grupy to: abc
i 12345
I jeszcze bardziej zmieniając:
/[if-([a-z0-9-]+)](.+?)(?=(?:[/?if))/s
pasuje do obu grup. Chociaż ogranicznik [/if]
nie jest przechwytywany przez żadną z nich.
UWAGA: Zamiast dopasowywania ograniczników użyłem przecznicy ((?=)
) w wyrażeniu regularnym, aby zatrzymać, gdy tekst z przodu pasuje do poprzedniej.
-1 dla odpowiedzi nr 3
Użyj kropki, aby dopasować dowolną postać.