Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Powtarzalność w wyrażeniu regularnym
Daimos
post 14.01.2014, 19:37:40
Post #1





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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

Ten post edytował Daimos 14.01.2014, 19:38:02


--------------------
scriptun.com. Startup z poradnikami do gier ttp.zone i ttpzone.pl
Go to the top of the page
+Quote Post
Mlodycompany
post 15.01.2014, 09:19:14
Post #2





Grupa: Zarejestrowani
Postów: 910
Pomógł: 44
Dołączył: 20.02.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


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
Go to the top of the page
+Quote Post
Daimos
post 15.01.2014, 12:36:52
Post #3





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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

Ten post edytował Daimos 15.01.2014, 12:48:47


--------------------
scriptun.com. Startup z poradnikami do gier ttp.zone i ttpzone.pl
Go to the top of the page
+Quote Post
YourFrog
post 15.01.2014, 16:37:09
Post #4





Grupa: Zarejestrowani
Postów: 124
Pomógł: 22
Dołączył: 10.01.2014

Ostrzeżenie: (0%)
-----


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

Ten post edytował YourFrog 15.01.2014, 16:43:07
Go to the top of the page
+Quote Post
Daimos
post 16.01.2014, 23:54:02
Post #5





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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!


--------------------
scriptun.com. Startup z poradnikami do gier ttp.zone i ttpzone.pl
Go to the top of the page
+Quote Post
kreatiff
post 19.01.2014, 16:36:48
Post #6





Grupa: Zarejestrowani
Postów: 324
Pomógł: 105
Dołączył: 7.08.2012

Ostrzeżenie: (0%)
-----


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).

Ten post edytował kreatiff 19.01.2014, 16:42:02
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 12.06.2024 - 19:05