Strpos si substr pentru "buton read more"

La un blog vroiam sa adaug un buton “read more” la sfarsitul fiecarui articol, puteam pune un link simplu cu idul articolului la sfarsitul loopului dar am vrut sa vad cum fac altii si am dat de urmatoarea situatie:

<?php
$lastspace = strrpos($body, '  ');
echo substr($body, 0, $lastspace) . "<a href='link?id=$post_id'>Read more</a>"?>

Ma rog sunt scoase din context, dar asta este tot ce ma intereseaza.

Strrpos cauta primul spatiu de la coada(’ ') la cap si retine pozitia iar in substr cauta in $body pozitia gasita de strrpos(prin $lastspace) si acolo afiseaza concatenarea care o am in continuare?
Iar acel 0 din substr ce reprezinta, ca nu cauta dupa un anumit parametru ci doar pozitia specificata prin $lastspace?

Este logic ce spun? Cum functioneaza mai exact ce am acolo…?

0 este pozitia din text de la care incepe substr sa taie din string, adica fix de la inceput. Al treilea parametru, $lastspace reprezinta lungimea de text pe care o taie incepand de la pozitia 0.
De exemplu, $lastspace este 10 atunci el ia 10 caractere din string incepand cu pozitia 0.

Mai multe detalii aici

@noah Ti-a scapat un detaliu, daca ai luat codul cu copy paste cand l-ai pus aici si fix asa il ai si tu. Codul ala nu cauta ultimul spatiu din text, ci ultima oara cand apar doua spatii unul dupa altul. Ia selecteaza cu mouse-ul spatiul ala dintre '', o sa vezi ca sunt doua de fapt. Daca ar fi cautat ultimul spatiu, atunci tot ce facea codul intreg era sa scoata ultimul cuvant din text si sa puna in locul lui un link de read more, ceea ce, sunt sigur ca esti de acord, nu ar avea nici un sens.

In schimb, am o banuiala ca cel de la care ai luat codul foloseste prin conventie intre el si cel care scrie articolele un spatiu dublu ca flag pentru plasarea link-ului de read more, la fel cum foloseste Wordpress comment-ul <!--more-->. In felul asta codul arunca tot ce vine dupa un spatiu dublu, si pune in loc link-ul de read more, iar cel care scrie articolele pune respectivul spatiu dublu unde considera el mai bine.

Nu este copiat, l-am scris aici.
De unde m-am inspirat este cu un spatiu si intr-adevar, dupa ultimul spatiu imi taie si imi pune linkul de “read more”.
Stiam ca nu este logic pentru ca oricum atat eu cat si in exemplul din care am luat partea respectiva se extrageau din BD un anumit numar de caractere, nu aveam de ce sa mai numar de doua ori stringul inainte sa-l afisez ci puneam direct echo $body . " Read More" ori puneam subtr($body, 0, 200), dar nu intelegeam exact ce face codul respectiv.

Recapitulare :smiley: :

//cauta pozitia numerica din $body pana la ultimul spatiu. Sa zicem ca ultimul spatiu este la pozitia 200.
 $lastspace =  strrpos($body, ' ');
// Incepand de la 0(inceput) imi numara 200 pozitii...
echo substr($body, 0, $lastspace);

Multumesc pentru lamurire.

Ca o paranteza, ai grija cu taiatul la numar fix de caractere. Pe langa ca aproape sigur vei taia un cuvant in doua, daca textul pe care il tai e de fapt HTML aproape sigur vei lasa un tag deschis care apoi nu se inchide, si iti va strica toata pagina.

4 Likes

Nu știu dacă există ceva soluție simplă care să-ți garanteze că nu tai aiurea atunci când ai tag-uri. De exemplu în Drupal există funcția asta text_summary() care poți să o copiezi la tine în cod (ștergi partea cu $format și ce ți se pare în plus).

În Wordpress există wp_trim_words(), care face ceva asemănător.

Sunt curios dacă există ceva librărie care să rezolve problema asta într-un mod elegant. La cât de comună este problema, nu cred că nu s-a apucat nimeni de așa ceva.

Presupunand ca n-ai nevoie de textul formatat (sapourile in general n-au), striptags si apoi truncate pe cuvinte, nu e chiar rocket science. Daca textul e formatat, e greu de conceput un algoritm care sa nu dea kix.

2 Likes

Exact ce a zis si @AdrianBasalic fac si eu. Strip tags si apoi tai.