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 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 ? 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 |
|
|
|
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ź
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 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 |
|
|
|
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: 20.08.2025 - 01:37 |