/ / regex dopasowuje liczby, ale nie litery - php, regex, preg-match

regex dopasowuje liczby, ale nie litery - php, regex, preg-match

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 № 1

Ta 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ć.