Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> RegExp dzielenie ciągów
session
post
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. \

  1. $str='string1\|string2|string3';
  2. $pattern="/[^\\\]\|/";
  3. $matches=preg_split($pattern, $str);
  4. print_r($matches);

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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
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.
  1. $input = '1111|2222|3333\\|3333|4444|55\\55|6666';
  2.  
  3. $array = preg_split('#(?<!\\\\)\\|#', $input);
  4.  
  5. print_r($array);
3. Nadal będziesz musiał wykonać dodatkową pętlę, która usunie znaki ucieczki sprzed znaku separatora:
  1. foreach ($array as &$element) {
  2. $element = str_replace('\\|', '|', $element);
  3. }
4. W powyższym kodzie brak wsparcia dla znaku ucieczki przed znakiem ucieczki, tj. następującego przypadku:
Kod
222\\|3333
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 31.12.2025 - 09:44