![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 24.08.2011 Ostrzeżenie: (0%) ![]() ![]() |
Witam, starannie rozglądam się w internecie, zanim o cokolwiek tutaj zapytam, bo wiem, że niektóre pytania są banalne, ale od tygodnia staram się rozwiązać problem preg_matcha. Zająłem się parsowaniem logów chatu gry (Minecraft), tak dla czystej przyjemności i w efekcie otrzymuję z logu:
takie coś: Oczywiście wszystko zapisane w tabeli itd. Jak łatwo się domyślić, znajduję znak "<", ">" oraz to co jest między nimi, żeby określić nick, a po spacji wiadomość. Preg_match wygląda tak:
Cały mój misterny plan ugrzązł w tym miejscu (fragment logu):
A mój skrypt parsuje to na takie coś:
Czyli uznaje dalszy ciąg, aż do znaku ">", jako nick, co ciekawe przed faktycznym nickiem dopisując ">", a nie po tym ciągu. Nie mam pojęcia o co chodzi, próbowałem na wiele sposobów ograniczyć występowanie znaku ">", np. przez "{,1}", ale dalej nie chce współpracować. Mam nadzieję, że napisałem jasno i wybaczcie, że się tak rozpisuję, ale chcę, żeby wszystko było jasne, dlatego małe wprowadzenie uznałem za stosowne. Z góry dziękuję za pomoc ![]() Ten post edytował kovalson 14.08.2012, 22:59:30 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 97 Pomógł: 15 Dołączył: 12.08.2012 Skąd: Zabrze Ostrzeżenie: (10%) ![]() ![]() |
Przykład:
Kod /<([^>]+)>/ Pobiera wszystko od znaku < do pierwszego znaku >. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 590 Pomógł: 107 Dołączył: 25.10.2011 Ostrzeżenie: (0%) ![]() ![]() |
Masz w pewnym miejscu w wyrażeniu ciąg znaków (.{1,}) - ma on za zadanie dopasowanie nicka gracza.
Dopasowuje on dowolny znak (".") wystepujący conajmniej raz "{1,}". Problem w tym, że taka instrukcja jest "zachłanna" - dopasowuje najwięcej znaków pasujących do wzorca - w praypadku, kiedy gracz użyje ">" w wypowiedzi, dopasuje także część wypowiedzi. 1. zamień w/w frament na (.*?) i powiedz, czy pomogło. 2. alternatywnie nie zamieniaj, ale dodaj za ostatnim "#" literkę "U" (zmienia tzw. "zachłanność" w ramach całego wzorca) |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 97 Pomógł: 15 Dołączył: 12.08.2012 Skąd: Zabrze Ostrzeżenie: (10%) ![]() ![]() |
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 24.08.2011 Ostrzeżenie: (0%) ![]() ![]() |
Voila, wielkie dzięki dla Ciebie abort, bo męczyłem się z tym przez tydzień. Widzę, że trochę od złej strony się za to zabierałem. A mógłbyś mi jeszcze wytłumaczyć jaką funkcję (w tym przypadku) pełni "?" na końcu? Chcę to zrozumieć w 100%, żeby później tego błędu nie powtarzać
![]() ![]() |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 305 Pomógł: 29 Dołączył: 5.07.2011 Ostrzeżenie: (0%) ![]() ![]() |
? oznacza, że podany wzorzec może wystąpić raz albo w ogóle.
I na przyszłość polecam stronę bardzo dobre narzędzie do sprawdzania wyrażeń regularnych. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 590 Pomógł: 107 Dołączył: 25.10.2011 Ostrzeżenie: (0%) ![]() ![]() |
http://www.php.net/manual/en/reference.pcr...n.modifiers.php
Poszukaj też o PCRE w ogólności, a także o słowach "greedy" i "ungreedy" (oczywiście w kontekście PCRE) @grzes999 w ogólności tak, ale w kontekście wyrażenia "(.*?)" znaczy już zupełnie coś innego (patrz wyżej) Ten post edytował abort 15.08.2012, 09:21:17 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 13:26 |