Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Cięcie stringa po n-tym powtórzeniu znaku
KotWButach
post 26.10.2012, 22:14:03
Post #1





Grupa: Zarejestrowani
Postów: 361
Pomógł: 10
Dołączył: 8.02.2012

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


Witam

chciałbym uzyskać bez użycia explode raczej dziejącą się w jednej linijce...

Dane są przykładowe i każda z nich będzie ulegać zmianie więc pomysły typu \trzy\cztery odpadaja.

jeden\dwa\trzy\cztery

wykonano operacje

jeden\dwa

Za pomoc thx smile.gif

Ten post edytował KotWButach 26.10.2012, 22:14:23
Go to the top of the page
+Quote Post
modern-web
post 26.10.2012, 22:29:51
Post #2





Grupa: Zarejestrowani
Postów: 763
Pomógł: 117
Dołączył: 15.03.2010
Skąd: void

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


Chcesz wykonać operacje na wzór explode bez użycia tej funkcji po n-tym powtórzeniu znaku dzielącego, tak?
Pytanie zadałeś bardzo chaotycznie, brak w nim jasnego przedstawienia problemu, na przyszłość staraj się poskładać myśli do kupy zanim zaczniesz tworzyć nowy temat.


--------------------
Pomogłem? Kliknij `Pomógł`. To nic nie kosztuje, a mnie usatysfakcjonuje! ;)
Go to the top of the page
+Quote Post
KotWButach
post 26.10.2012, 22:33:19
Post #3





Grupa: Zarejestrowani
Postów: 361
Pomógł: 10
Dołączył: 8.02.2012

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


przecież masz przykład
jak bez eksplode uzyskać

z

ciągu jeden\dwa\trzy\cztery

to

jeden\dwa

gdzie dane mogą się zmieniać.
Go to the top of the page
+Quote Post
modern-web
post 26.10.2012, 22:45:07
Post #4





Grupa: Zarejestrowani
Postów: 763
Pomógł: 117
Dołączył: 15.03.2010
Skąd: void

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


Dobra, jak chcesz sobie utrudniać... sądziłem, że źle zrozumiałem (bo to bez urazy debilne pytanie, gdy ma się sprawdzoną, dobrze zoptymalizowaną funkcję o wcześniej wspomnianej nazwie).
1. wrzuć sobie każdy znak do osobnego indexu w tablicy -> str_split
2. w pętli sprawdź, czy wskazany znak jest / i zapisz który raz się powtarza
3. powtarzaj krok 2 aż znak / nie pojawi się n-razy, później zapisz index w którym ucinasz stary ciąg
4. wytnij z tablicy odpowiedni zakres
5. sklej do stringa

O to chodziło?


--------------------
Pomogłem? Kliknij `Pomógł`. To nic nie kosztuje, a mnie usatysfakcjonuje! ;)
Go to the top of the page
+Quote Post
KotWButach
post 26.10.2012, 22:58:28
Post #5





Grupa: Zarejestrowani
Postów: 361
Pomógł: 10
Dołączył: 8.02.2012

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


Ehh na siłę próbujesz mi wmówić że zadałem debilne pytanie.

Ale chodzi mi o łatwiejsze rozwiązania... (czyt. krótsze mieszczące się w jednej linijce) I proszę osobiste wycieczki komuś innemu... nie ma się co pieklić...

Jeżeli się nie da to moje pytanie uzyska jedyną słuszną odpowiedź ale może wyrażenia regularne albo co istnieje? Nie wiem... inaczej bym nie pytał.

dla przykładu to zadziała na usunięcie tylko ostatniej cześci
  1. mb_substr($path, 0, -mb_strlen(strrchr($path, "\\")));


Ten post edytował KotWButach 26.10.2012, 23:02:23
Go to the top of the page
+Quote Post
modern-web
post 26.10.2012, 23:01:02
Post #6





Grupa: Zarejestrowani
Postów: 763
Pomógł: 117
Dołączył: 15.03.2010
Skąd: void

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


Możesz całość skrócić poprzez zastosowanie odwołania $str{x} gdzie x jest numerem znaku, ale to i tak niewiele zmienia bo musisz wykonać pętle, tak czy inaczej...
Także jedna linijka to tylko w 1 przypadku: explode.

@edit ale w tym przypadku szukasz znaku, to nie jest sztywne ucinanie końcówki/początku a dynamiczne weryfikowanie zawartości ciągu o losowej długości w poszukiwaniu określonego znaku.

@edit 2 wyrażeniem regularnym mógłbyś to rozpykać, przyznaję że to dość krótki sposób ale to nie będzie jedna linijka ze względu na konieczność późniejszego "sklejenia" wyników z wyrażenia w ciąg.

Ten post edytował modern-web 26.10.2012, 23:04:16


--------------------
Pomogłem? Kliknij `Pomógł`. To nic nie kosztuje, a mnie usatysfakcjonuje! ;)
Go to the top of the page
+Quote Post
tehaha
post 27.10.2012, 11:58:59
Post #7





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


@KotWButach Jeżeli dobrze zrozumiałem to chcesz przykładowo uciąć tekst po drugim wystąpieniu znaku "/". W takim razie używasz funkcji strpos() aby ustalić jego pozycję, a potem substr(), żeby uciąć i tyle. Zauważ, że w funkcji strpos, masz opcjonalny parametr offset, którym możesz ustawić właśnie, które powtórzenie znaku w stringu Ciebie interesuje i ustalić jego pozycję.

Więc pewnie będzie to coś w stylu:
  1. substr($string, strpos($string, "/", 1));
dla drugiego wystąpienia "/" w tekście, ale sprawdź bo pisane z palca

Ten post edytował tehaha 27.10.2012, 12:01:25
Go to the top of the page
+Quote Post
droslaw
post 27.10.2012, 15:31:37
Post #8





Grupa: Zarejestrowani
Postów: 98
Pomógł: 33
Dołączył: 10.05.2011
Skąd: Krak

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


Cytat(tehaha @ 27.10.2012, 12:58:59 ) *
Więc pewnie będzie to coś w stylu:
  1. substr($string, strpos($string, "/", 1));
dla drugiego wystąpienia "/" w tekście, ale sprawdź bo pisane z palca

To nie zadziała by pozycja pierwszego slasha musiałaby być znana, nie jest to 1.
Przychodzi mi do głowy preg_match:
  1. $a = array();
  2. $path = 'a/b/c/d/e';
  3. preg_match('/(\w+\/\w+)/',$path,$a);//teraz $a to tablica z jednym elementem : "a/b"

Można też z explode:
  1. $path = 'a/b/c/d/e';
  2. $elementsNumber = 2; // chcemy 2 elementy
  3. implode('/',array_slice(explode('/', $path, $elementsNumber+1), 0, $elementsNumber)) // zwróci "a/b"
  4.  
Go to the top of the page
+Quote Post
tehaha
post 27.10.2012, 15:59:10
Post #9





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


Cytat
To nie zadziała by pozycja pierwszego slasha musiałaby być znana, nie jest to 1.
masz rację, zajrzałem do manuala i faktycznie wydawało mi się, że tam ustawiasz, które wystąpienie stringa ma być szukane.

Ale w każdym razie wydaje mi się, że i tak użycie funkcji strpos() w pętli powinno być wydajniejsze niż wyrażenia regularne, po prostu w każdej następnej pętli dajesz offset = ostatnia pozycja + 1.

Edit: znalazłem nawet gotowy kod na to: http://board.phpbuilder.com/showthread.php...within-a-string do funkcje substr() wstawiasz wynik tej funkcji.

Ten post edytował tehaha 27.10.2012, 16:00:54
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: 28.04.2024 - 19:44