Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Dzielenie String do tablicy o określonej ilości znaków
Forum PHP.pl > Forum > Przedszkole
nappy
Cześć, nie wiem jak się za takie coś zabrać:

Potrzebuje po pobraniu konkretnego tekstu (np 1500znaków ale będzie to zmienna liczba) podzielić go na 2 nierówne części. Np pierwsza ma 300znaków a druga - reszte. Czyli coś na kształt explode(); która nie dzieli po określonym separatorze a określonej ilości znaków...

Zawsze można podzielić na równe części i wszystkie prócz pierwszej potraktować implode(); tylko kurcze nie wiem jak rozwiązać samo dzielenie tekstu. Byłbym wdzięczny za każde info, nie oczekuje gotowca - ucze się i chętnie poczytam 'wskazówki' smile.gif
phpion
substr
fleshgrinder
Cytat(phpion @ 9.06.2010, 15:29:26 ) *


i strlen, to wszystko czego potrzebujesz do napisania takiej funkcji
jajcarzd1
  1.  
  2. $napis = '123456789';
  3.  
  4. //zwróci 123 czyli 3 znaki poczynając od tego na pozycji zero
  5.  
  6. echo substr($napis,0,3);
  7.  
nappy
Dzięki, pomogliście smile.gif A teraz kolejny 'etap' którego nie wiem jak ugryźć. Mianowicie chodzi o ucinanie słów w połowie, jak zrobić by skrypt doszedł do pierwszej kropki po tych np 300 znakach (czyli defacto będzie więcej niż 300 znaków) ?
tehaha
jeżeli chcesz zrobić coś na zasadzie, żeby tekst był nie dłuższy niż 300 znaków ale żeby ni urywał się w połowie słowa to możesz, po tym wycięciu 300 znaków, funkcją http://php.net/manual/en/function.strrpos.php ustalić pozycję ostatniej spacji lub ostatniej kropki i jeszcze raz przyciąć tekst tak żeby wyglądał bardziej elegancko, a jeżeli chcesz żeby znalazł pierwszą kropkę lub pierwszą spację za 300 znakiem to robisz funkcją http://php.net/manual/en/function.strpos.php z ustawionym offset na 300
nappy
Śmiga smile.gif A jest jakaś opcja, żeby odcięcie nastąpiło po jednym z wielu (tj kropka, wykrzyknik, znak zapytania) ? Bo jedyne na co wpadłem to zrobienie 3x tego samego i wybranie tej która ma najmniejsza wartość (czyli np znak '?' wystąpi prędzej niż '!' albo '.' to wyświetla się tekst do '?'). Ale mam wrażenie, że to da się zrobić prościej (a z pewnością szybciej/wydajniej) ^^.

tehaha
możesz tymi funkcjami ustalić pozycję dla znaków: ?, !, . , potem wybierasz sobie z nich najmniejszą funkcją http://php.net/manual/en/function.min.php żeby wybrać ten który jest najbliżej i ucinasz
nappy
Ok (dzięki Waszej pomocy) rozwiązałem swój problem, poniżej kod dla potomnych. Może komuś się przyda. Przy okazji byłbym wdzięczny gdyby ktoś to sprawdził/napisał co można było zrobić inaczej etc. Jakieś uwagi smile.gif

--

Całość wrzucamy do pliku functions.php w głównym katalogu naszego theme'a. (wp includuje ten plik automatycznie).

Co to robi?

Dzieli nam tekst (cały, bez tagów <p>,<span> itp - czysty tekst) na 2 części. Pierwsza (excerpt) wyświetla fragment tekstu od początku do (domyślnie) 600 znaku. Skrypt wyszukuje pierwszą kropke/wykrzyknik/znak zapytania/średnik i dopiero po nim ucina tekst. Więc problem ucinania słowa/zdania w środku odpada.

Plusy wiadome, możemy osobno wywoływać/formatować wstęp/tekst, działać na nim z jQuery, nie ma żadnych tagów-śmieci z WP.

Wywołanie:
Kod
show_post(); // wyświetli wstęp, domyślnie 600 znaków
show_post(content, 666); // wyświetli część tekstu zaczynając od 666 znaku.


Więc jeśli chcemy wyświetlić cały tekst w ciągu od np 700 znaku to wpisujemy:

Kod
show_post(excerpt, 700); //pierwszy parametr nie jest wymagany
show_post(content, 700); //wyświetli reszte tekstu




Kod
    function cut_off($lookfor, $lenght) {
    
    global $more;
    $more = 1;
    $whole_content = get_the_content();
    $cutoff_pos = strpos($whole_content, $lookfor, $lenght);    
    return $cutoff_pos;
    }
    


    function show_post($select = "excerpt", $excerpt_lenght = "600") {
    global $more;
    $more = 1;
    $whole_content = get_the_content();
                
        $whole_content_lenght = strlen($whole_content);
        
        if ($excerpt_lenght<$whole_content_lenght)
        {
            $punctation[0] = cut_off('.',"$excerpt_lenght");
            $punctation[1] = cut_off('!',"$excerpt_lenght");
            $punctation[2] = cut_off('?',"$excerpt_lenght");
            $punctation[3] = cut_off(';',"$excerpt_lenght");
            
            $i = 0;
            foreach($punctation as $pointer) {
                
                if(empty($pointer) === FALSE) {
                    $true[$i] = $pointer;
                }

                $i++;
            }
                                    
            $nearest_pointer = min($true);
            $nearest_pointer = $nearest_pointer+1;
            
            
            $text[excerpt] = substr($whole_content, 0, $nearest_pointer);
            $text[content] = substr($whole_content, $nearest_pointer);
            
            echo $text[$select];
            
        }
        else
        {
            echo "$whole_content";
        }
    }

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.