Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Cięcie stringa po n-tym powtórzeniu znaku
Forum PHP.pl > Forum > PHP
KotWButach
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
modern-web
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.
KotWButach
przecież masz przykład
jak bez eksplode uzyskać

z

ciągu jeden\dwa\trzy\cztery

to

jeden\dwa

gdzie dane mogą się zmieniać.
modern-web
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?
KotWButach
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, "\\")));
modern-web
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.
tehaha
@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
droslaw
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.  
tehaha
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.