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)

$short = striptags(html_entity_decode($s));
$pos   = strpos($short, ' ', 150);
$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
<?php

$max = 100;

$chr = 'tartalom';

$chr = nl2br($chr);

if (strlen($chr) >= $max) {

$pos_pont = strpos($chr, '. ', $max);
$pos_felk = strpos($chr, '! ', $max);
$pos_kerd = strpos($chr, '? ', $max);
$pos_pont_br = strpos($chr, '.<br />', $max);
$pos_felk_br = strpos($chr, '!<br />', $max);
$pos_kerd_br = strpos($chr, '?<br />', $max);

}

$pos_arr = array();

if ($pos_pont != NULL) {
array_push($pos_arr, $pos_pont);
}
if ($pos_felk != NULL) {
array_push($pos_arr, $pos_felk);
}
if ($pos_kerd != NULL) {
array_push($pos_arr, $pos_kerd);
}
if ($pos_pont_br != NULL) {
array_push($pos_arr, $pos_pont_br);
}
if ($pos_felk_br != NULL) {
array_push($pos_arr, $pos_felk_br);
}
if ($pos_kerd_br != NULL) {
array_push($pos_arr, $pos_kerd_br);
}

if (count($pos_arr) == 0) {
$chr_len = strlen($chr);
array_push($pos_arr, $chr_len);
}

$pos = min($pos_arr);

$chr = substr($chr, 0, $pos);

switch ($pos) {

case $pos_pont:
$chr = ''.$chr.'.';
break;
case $pos_felk:
$chr = ''.$chr.'!';
break;
case $pos_kerd:
$chr = ''.$chr.'?';
break;
case $pos_pont_br:
$chr = ''.$chr.'.';
break;
case $pos_felk_br:
$chr = ''.$chr.'!';
break;
case $pos_kerd_br:
$chr = ''.$chr.'?';
break;

}

print $chr;

?>
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
<!-- 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