![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 112 Pomógł: 22 Dołączył: 11.04.2010 Skąd: Tarnów Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Moim celem jest podzielenie ciągu w którym separatorem jest na przykład taki znak: | ale pod warunkiem, że przed tym znakiem nie występuje np. \
Kod prawie działa prawidłowo, niestety ucinany jest znak występujący przed |, czyli: "2" w ciągu: "string1\|string2". Chciałbym też, żeby skrypt usuwał/pomijał znak: "\", jeśli występuje on tuż przed "|", niestety lookahead nie wszędzie jest prawidłowo wspierany, dlatego zdecyduję się chyba na użycie osobnej funkcji, chyba że można to osiągnąć przy zastosowaniu odpowiedniego wzorca (IMG:style_emoticons/default/rolleyes.gif) . Wiem jak osiągnąć mój cel innymi sposobami tj. explode + pętla foreach + instrukcja warunkowa, ale interesuje mnie wykonanie tego za pomocą wyrażeń regularnych. Macie jakieś pomysły na prawidłowy pattern ? (IMG:style_emoticons/default/wink.gif) Ten post edytował session 1.11.2013, 23:45:54 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Wyrażenia regularne nie są najlepszym rozwiązaniem w tym wypadku.
1. Zamiast z lookahead powinieneś skorzystać z lookbehind. 2. 3. Nadal będziesz musiał wykonać dodatkową pętlę, która usunie znaki ucieczki sprzed znaku separatora: 4. W powyższym kodzie brak wsparcia dla znaku ucieczki przed znakiem ucieczki, tj. następującego przypadku: Kod 222\\|3333
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 346 Pomógł: 23 Dołączył: 28.11.2004 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 3 034 Pomógł: 366 Dołączył: 24.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
no_face
Cytat Wiem jak osiągnąć mój cel innymi sposobami tj. explode + pętla foreach + instrukcja warunkowa, ale interesuje mnie wykonanie tego za pomocą wyrażeń regularnych. autor napisał że explode mu nie odpowiada (IMG:style_emoticons/default/smile.gif) |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 112 Pomógł: 22 Dołączył: 11.04.2010 Skąd: Tarnów Ostrzeżenie: (0%) ![]() ![]() |
@Crozin dzięki za odpowiedź (IMG:style_emoticons/default/smile.gif) .
W odniesieniu do Twojego posta: 3. Właściwie miałem str_replace tuż przed wyświetleniem stosować, dlatego też pętla nie byłaby potrzebna, ale to mało istotne (IMG:style_emoticons/default/wink.gif) 4. Tak właściwie to z czego to wynika ? Chyba przy okazji w całym ciągu tak się dzieje. Wynika to z natury backslashy, że domyślnie służą do innych celów czy wynika to z samego wyrażenia ? Unikam explode ponieważ w zdecydowanej większości przypadków w ciągu nie będzie w ogóle występował znak: | , ale jeśli się on już pojawi skrypt musi odpowiednio na niego zareagować, ale nie mogę też zabrać żadnego znaku z zestawu, więc musi być możliwość potraktowania znaku: | po prostu jako tego znaku bez modyfikacji. W dodatku byłem ciekaw, bo jak wiadomo explode nie umożliwia np negacji znaku, a sama możliwość wykorzystania wyrażenia jako takiego jakby separatora wydaje się dla mnie co najmniej intrygująca (IMG:style_emoticons/default/wink.gif) . A co myślicie o preg_match ? Zadziałałoby identycznie ? |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Ad. 3. Mimo wszystko powinieneś mieć tą pętlę. Pomiędzy wstępnym przetworzeniem danych, a dokończeniem tego procesu i wyświetleniem danych może w przyszłości dojść jeszcze jakiś kod - tworzysz potencjalne miejsce dla błędów.
Ad. 4. Wynika to z użycia niewłaściwego narzędzia, tj. wyrażeń regularnych, w danym zadaniu. Same ukośniki są znakiem jak każdy inny, nie mają żadnej specjalnej natury w tym kontekście. --- 1. Użycie preg_match() niczego nie zmieni. 2. Napisz po prostu zwykły parser dla tego formatu - to raptem kilkanaście linii kodu. Będzie działać wolniej od dowolnej kombinacji wyrażeń regularnych, explode'ów i innych, ale to już wynika powolności samego PHP. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.08.2025 - 00:41 |