Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak policzyć liczbę linijek tekstu?
Forum PHP.pl > Forum > PHP
RinG
Witam, mam następujące pytanie:

jak można policzyć ilość linijek tekstu wyświetlanego na ekranie usera, przy założeniu, że szerokość <DIV>-a jest stała i czcionka nie jest monotypiczna (czyli nie jest to Courier, etc)?

Zaznaczam, że nie chodzi mi o zliczanie linii w pliku, tylko tekstu wyświetlanego z jakiejśtam zmiennej. Próbowałem zliczać na zasadzie:

  1. <? count(explode("n", $text)) ?>


ale to daje mi tylko ilość naciśniętych przy wprowadzaniu tekstu enterów, nie ilość linijek, które pojawią się na ekranie...

Z góry dzięki za wszelką pomoc smile.gif
Cysiaczek
Przecież przeglądarka automatycznie zawinie tekst do wymaganej szerokości, więc raczej baardzo ciężko to policzyć. Musiałbyś porobić szereg wyliczeń związanych z szerokością i wysokością diva z tekstem, uśrednić ilość znaków mieszczących się w linii (bo mówisz, że czcionka nie jest monotypiczna). Na koniec policzyć ile znaków ma tekst i na podstawie powyższego przewidzieć jakimś algorytmem ilość linii.

Jest jeszcze szybszy sposób, ale nie jestem pewien, czy on zadziała:
Wstawiasz wesoło tekst do diva bez zdefiniowanej na sztywno wysokości, a na koniec pobierasz jego aktualny height i dzielisz przez wysokość czcionki. W teorii powinno dać ilość lini.

Pozdrawiam
bendi
Rozwiazan jest sporo - od tworzenia obrazka na ktorym umieszczasz tekst z takimi samymi ustawieniami jak na docelowym divie, do tworzenia ukrytego div'a po stronie klienta, odczytania jego wymiarow i przepisania gdzie trezba.

Napisz do czego Ci to potrzebne to bedzie latwiej wskazac najbardziej pasujace rozwiazanie.
RinG
Otóż mam sobie stronę główną, a na niej pewnego DIV'a o stałej szerokości, powiedzmy, 540px. I teraz wyciągam jakiś tekst z bazy (jego treść oczywiście zmienia się od czasu do czasu), który wrzucam do wspomnianego DIV'a. Cały knif leży w tym, że muszę jeszcze po stronie serwera wyliczyć, ile linijek tekstu przy standardowych ustawieniach wyświetli się w tym DIV'ie userowi na ekranie, by następnie wynik wyliczenia zapisać do innego rekordu w bazie.

W zasadzie wysokość DIV'a jest bez znaczenia, interesuje mnie tylko - gdy zostanie osiągnięta pewna minimalna długość - by można było sprawdzić, ile tych linijek w nim jest.

Odrzuciwszy rozwiązanie, o którym pisałem w pierwszym poście, myślałem jeszcze, żeby przeliczyć szerokość w pikselach każdej literki osobno (bo przecież 'W' != 'i') i podstawić do jakiegoś wzorku, ale to chyba zbyt chałupnicze rozwiązanie biggrin.gif
bendi
Wyliczanie po stronie serwera to dosc siermiężne zadanie - możesz zrobić tak jak mówiłem, stworzyć obrazek korzystając np. z gd2 i będziesz wiedział jaka to wysokość, chociaz to nie daje żadnej gwarancji, bo użytkownik może nie mieć w systemie czcionki, którą zdefiniowałeś dla tego div'a.

Ja bym zrobił zdarzenie na onload, które odczyta wymiary div'a i odeśle dane do serwera, używając np ajax'a.
RinG
Hmmm, co do zrobienia obrazka w gd2, to sęk w tym, że w samym divie oprócz tekstu też są obrazki (wstawione zwykłym html-owym tagiem), dlatego sama długość txt nic mi nie daje w końcowym rozrachunku.

Jeśli chodzi o onload, to też jest jakaś opcja, ale raz, że potrzeba mi tego przeliczenia tylko jednorazowo, dwa, że pierwszy przypadkowy user, dla którego byłaby ta wartość wyliczania, mógłby mieć właśnie niestandardową czcionką bądź rodzielczość (a mnie chodzi o wynik przeciętny, standardowy) i trzy w końcu - najlepiej byłoby, gdyby ilość tych linijek wyliczyć od razu, przy wstawianiu nowego tekstu do bazy (żeby przy wyciąganiu wynik wyliczenia był już dostępny), a nie dopiero przy wyświetlaniu.

No nic, jeżeli macie jeszcze jakieś idee, zamieniam się w słuch, a jeśli nie - będę kombinował z powyższymi winksmiley.jpg
Jabol
  1. <?php count(explode("<br", $text)); ?>
To powinno działać dla HTML.
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.