ugrás a tartalomhoz

html elemek elrontjá az oldalt ha csak egy bizonoy mennyiségű karaktert iratok ki a tartalomból

Anonymous · 2006. Nov. 25. (Szo), 04.24
Üdv!

Lenne egy problémám:
VAn mondjuk egy cikk ami 5ezer karaktert tartalmaz, a cikkben engedélyezem a html elemeket vagyis kiiratáskor nem használok htmlspecialchars()-t csak nl2br()-t a sortörések miatt semmi bbcode.
De ugye a címlapon kicsit hosszú lenne ez az 5000 karakter ezért megjelenítek csak 150 és kiteszek egsy tovább gombot, ez eddig ok is.
így:
substr($tartalom, 0, 150);

na de mivan akkor ha pont egy <a href=""> elemnél van a 150. karakter és akkor nem zárja le > jellel, és akkor a többi cikk nem látszódik az oldalon, nos ezt megoldottam úgyhogy ilyenkor htmlspecialchars()-t csinálok ez megoldja de hülyén néz ki hogy kiirja hogy: <a href= vagy pedig ha elötte egy link van ugyeakkor azt sem alakítja át linké.

$a = substr($tartalom, 0, 150);
$a = htmlspecialchars($a);
$a = né2br($a);

nos most így iratom ki röviden

Ere mi lehet a megoldás?

Előre is kösszi.
 
1

strip_tags

attlad · 2006. Nov. 25. (Szo), 06.01
php.net/strip_tags aztán azt vágod meg. Bár a fix 150 karakternél elvágás nem éppen elegáns, minimum mondat végénél kéne..
2

egy variáció

Sulik Szabolcs · 2006. Nov. 25. (Szo), 11.09
Hát egy egyszerűbb megoldás, hogy miután kiirtottad a html tagokat a szövegből, megkeresed a 150. karakter utáni első szóközt (vagy mondat végét).

Nagyvonalakban: (ha $s-ben van a szöveg)
  1. $short = striptags(html_entity_decode($s));  
  2. $pos   = strpos($short' ', 150);  
  3. $short = substr($short, 0, $pos);  
Ennél persze van jóval elegánsabb megoldás is.
3

honnan tudom hol a mondat vége?

Vas Dávid · 2006. Dec. 16. (Szo), 02.37
honnan tudom hol a mondat vége?

mert pl ha egy képet linkelek
<img src="1.jpg"> akkor van benne egy pont és az strpos()-ban hiába állítok be '.' -t mikor azt hiszi, hogy a kép link közepén van vége a mondatnak vagy íhy használjam: '. ' ?
4

nods ilyet csináltam

Vas Dávid · 2006. Dec. 16. (Szo), 16.52
  1. <?php  
  2.   
  3. $max = 100;  
  4.   
  5. $chr = 'tartalom';  
  6.   
  7. $chr = nl2br($chr);  
  8.   
  9. if (strlen($chr) >= $max) {  
  10.   
  11. $pos_pont = strpos($chr'. '$max);  
  12. $pos_felk = strpos($chr'! '$max);  
  13. $pos_kerd = strpos($chr'? '$max);  
  14. $pos_pont_br = strpos($chr'.<br />'$max);  
  15. $pos_felk_br = strpos($chr'!<br />'$max);  
  16. $pos_kerd_br = strpos($chr'?<br />'$max);  
  17.   
  18. }  
  19.   
  20. $pos_arr = array();  
  21.   
  22. if ($pos_pont != NULL) {  
  23. array_push($pos_arr$pos_pont);  
  24. }  
  25. if ($pos_felk != NULL) {  
  26. array_push($pos_arr$pos_felk);  
  27. }  
  28. if ($pos_kerd != NULL) {  
  29. array_push($pos_arr$pos_kerd);  
  30. }  
  31. if ($pos_pont_br != NULL) {  
  32. array_push($pos_arr$pos_pont_br);  
  33. }  
  34. if ($pos_felk_br != NULL) {  
  35. array_push($pos_arr$pos_felk_br);  
  36. }  
  37. if ($pos_kerd_br != NULL) {  
  38. array_push($pos_arr$pos_kerd_br);  
  39. }  
  40.   
  41. if (count($pos_arr) == 0) {  
  42. $chr_len = strlen($chr);  
  43. array_push($pos_arr$chr_len);  
  44. }  
  45.   
  46. $pos = min($pos_arr);  
  47.   
  48. $chr = substr($chr, 0, $pos);  
  49.   
  50. switch ($pos) {  
  51.   
  52. case $pos_pont:  
  53. $chr = ''.$chr.'.';  
  54. break;  
  55. case $pos_felk:  
  56. $chr = ''.$chr.'!';  
  57. break;  
  58. case $pos_kerd:  
  59. $chr = ''.$chr.'?';  
  60. break;  
  61. case $pos_pont_br:  
  62. $chr = ''.$chr.'.';  
  63. break;  
  64. case $pos_felk_br:  
  65. $chr = ''.$chr.'!';  
  66. break;  
  67. case $pos_kerd_br:  
  68. $chr = ''.$chr.'?';  
  69. break;  
  70.   
  71. }  
  72.   
  73. print $chr;  
  74.   
  75. ?>  
nos ez a kód elvileg megcsinálja a dolgot, de persze nem mionden ok benne.
Mert ugye ? ! . ellenorzi hogy a mondat végén van-e de ha sortörés van akkor is ellenőrzi őst ha egyik sincs benne akkor kiirja az egész tartalmat.

A tartalom a $chr változóban van, a $max változóban lehet beállítani azt a számot amenyit kiirjon a bevezetőben.

De itt is van gond, az hogy a tartalomba beleszámolja a sortöréseket, mert ugye az pozicionáslás elött strpos() a tartalmat nl2br() -el átalaktítom, mert ugye így tudom megvuzsgánli azt hogy az írásjel után állhat-e sortörés.

Nos mit szóltok a kódhoz, szerintetek jó, és mi javítani való van rajta?
5

more komment

Fekete Ferenc GDA · 2006. Dec. 16. (Szo), 17.50
szerintem meg sokkal egyszerűbb lenne, ha a "bekezdés" után beleírnád kommentként, hogy
  1. <!-- more -->  
és mindig itt választanád ketté a lead-et a tartalomtól. ráadásul, mivel ez html komment, nem is jelenik meg a tartalomban.

kicsit hatékonyabb és elegánsabb, mint a fenti hatalmas kódhalmaz
6

ő ezt nem nagyon értem

Vas Dávid · 2006. Dec. 17. (V), 14.39
Bocs, de ezt nem értem, hogy mire jó az a more komment, az most pontosan mit is csinál a tartalommal?
7

más megközelítés

Fekete Ferenc GDA · 2006. Dec. 17. (V), 17.21
önmagában a more komment semmit nem csinál:)

Te azt szeretnéd, hogy (legalábbis én úgy értelmeztem), hogy egy hosszabb cikk bevezetőjét leválaszd a többi részétől, valamiylen szinten "automatikusan" és azt is írtad, hogy html használata is engedélyezett.

Namost, két megoldás is lehetséges:

az egyik az általad említett hosszú kód, amely megpróbálja kitalálni a mondat végét, figyel a benne lévő img tag-ekre, stb.

A másik megoldás viszont kb 2 sor:

Ahol szeretnéd kettéválasztani a bevezetőt és a tartalmat, oda beteszel egy kommentet, ami az oldalon nem jelenik meg, hanem felbontod a teljes tartalmat ott, ahol a komment van. ( explode erre jó, ha jól emlékszem, minta alapján tömböt épít) és a tömb eéső elemét (ami a bevezető) íratod ki. Mivel ezt a kommentet Te helyezed el, nem kell arra megírni egy script-et, ami figyel az írásjelekre, egyéb tag-ekre, stb.
Úgy emlékszem, hogy a drupal is így csinálja, vagy csinálta valamikor.

Szóval csak egy egyszerűbb megoldás a problémára, jóval kevesebb munkával jár és az eredmény ugyanaz.
8

értem

Vas Dávid · 2006. Dec. 17. (V), 19.56
Aha értem, szóval aki beküldi a cikket annak kell, elhelyeznie a more kommentet.

De ezzel csak annyi a baj, hogy:
-nem mindenki tudja, hoigy el kell helyezni még ha a beviteli mező alá-elő oda is írnám
- és ha valaki egy 5000 karakterből álló cikket beküld is direkt nem teszi oda
- vagy ha mondjuk 1000 karakter után teszi azt ki

Nos végülis ez is egy szerintem jó megoldás, de ezt majd a saját honlapomon fogom használni.

Kössz a tippet.
9

szívesen

Fekete Ferenc GDA · 2006. Dec. 17. (V), 20.52
szívesen