Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Powtarzalność w wyrażeniu regularnym
Forum PHP.pl > Forum > PHP
Daimos
Witam
Załóżmy sobie wyrażenie:
  1. $string = "[ab][cd][ef]g[hi][jk]";


Potrzebuję teraz pobrać wszystkie nawiasy, które są obok siebie, jako oddzielne elementy w tablicy, czyli powyższy przykład chcę aby docelowo wyglądał mniej więcej tak:
  1. $result = array(
  2. 0 => array('[ab]','[cd]','[ef]'),
  3. 1 => array('[hi]','[jk]'),
  4. );

Dlaczego tak? Ponieważ znalazło w jednym ciągu wyrażenie [ab][cd][ef] a później [hi][jk] - cały ciąg został rozbity przez element "g", który był bez nawiasów, ale może to być dowolny znak, tylko nie nawias.
Oczywiście staram się to potraktować pregiem, tylko mam tutaj problem z "nieskończonością ciągu". Nie wiem, czy nawiasów obok siebie będzie trzy, czy tysiąc i tu mam problem, może macie jakieś propozycje?
Już skończyły mi się pomysły na wyrażenia, jedyne co mi teraz przychodzi do głowy to lecieć znak po znaku i sprawdzać gdzie nawias się otworzył i gdzie zamknął, ale podejrzewam, że musi być jakieś wyrażenie regularne, które to załatwi
Mlodycompany
spróbuj czegoś takiego

  1. preg_match_all('#\[[a-zA-z]\]#', $string, $match);


pisane z pamięci więc może nie działać wink.gif
Daimos
Ale w ten sposób znajdzie mi wszystkie nawiasy jako oddzielny element i nie będę wiedział jak wyglądał ich cały ciąg. Mi potrzebne oddzielnie ciągi nawiasów jak na przykładzie:
  1. $result = array(
  2. 0 => array('[ab]','[cd]','[ef]'),
  3. 1 => array('[hi]','[jk]'),
  4. );

Muszę wiedzieć, że [ab][cd][ef] to był ciąg nawiasów, więc w sumie mogę i taki wynik dostać:
  1. $result = array(
  2. 0 => ('[ab][cd][ef]'),
  3. 1 => ('[hi][jk]'),
  4. );

edit:
Ok załatwiłem to takim wyrażeniem:
Cytat
'/(\([^\)|^\(]+\)){1,}/'

Czarodziej {1,} o którym zapomniałem, rozwiązał problem. Zastanawia mnie tylko dlaczego mam dziwne wyniki, zazwyczaj preg_match daje mi w 1 kluczu tablicy pożądany wynik, tutaj mam w 0, natomiast w 1 mam ostatni nawias z ciągu. Dziwne, ale ogólnie działa
YourFrog
Może i mój kod się wykonuje jak ślimak przy wyrażeniu. Ale chociaż działa ;P

http://wklej.to/0va2v


var_dump na $matches daj u siebie. Wieczorem ci napisze wyrażenie choć osobiście ci go nie polecam.

@Edit.
Gdy zmniejszyłem ciag do takiego jak podałeś na forum to spadek jest tylko 8 krotny z 0.001 do 0.008 więc nie tak źle dla krótkich ciągów znaków
Daimos
to się naprodukowałeś hehe, dzięki, ale jak pisałem na początku, nie chciałem iść tą drogą smile.gif Moje wyrażenie działa, tylko akurat tu wkleiłem do przykładu z nawiasami okrągłymi ().
W każdym razie wielkie dzięki, nie sądziłem, że ktoś aż tak na poważnie podejdzie do tematu, oby więcej takich forumowiczów, pozdrawiam!
kreatiff
preg_match_all('#(\[.*?\])(?!\[)#', $string, $result);

Oj, nie zauważyłem, że znalazłeś wzór sam, no ale jak już napisałem, to zostawiam dla potomnych alternatywne rozwiązanie z wykorzystaniem negative lookahead (nie wiem jak to po naszemu jest tłumaczone).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.