[PHP] Afbreken tekst

Pagina: 1
Acties:
  • 730 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb wat rond zitten zoeken over het bepalen van de breedte die een bepoaalde string gaat zijn, maar kreeg de indruk dat dit niet mogelijk is, tenzij je iets doet als het tellen van 'brede karakters' of iets dergelijks.

Ik wil tekst die te lang wordt af laten breken, net als de grote kolom met het laatste nieuws etc. links op www.tweakers.net. Daar worden de regels heel efficient afgebroken, ze vullen bijna de hele regel. Hoe kan ik dit zelf bereiken?

Acties:
  • 0 Henk 'm!

Verwijderd

Substr?
Zelf gebruik ik een zelfgemaakte functie:

PHP:
1
2
3
4
5
6
7
8
9
<?
function text($data, $max){
$length = strlen($data);
if($length>=$max){
$output = substr($data, 0, $max);
return $output;
}
}
?>


Dit is dan ff snel snel getypt, maar zoiets werkt wel als het goed is.
(heb niet getest omdat ik op school zit hoor)

Acties:
  • 0 Henk 'm!

  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 07-07 13:36
Verwijderd schreef op 16 december 2003 @ 13:40:
Ik heb wat rond zitten zoeken over het bepalen van de breedte die een bepoaalde string gaat zijn, maar kreeg de indruk dat dit niet mogelijk is, tenzij je iets doet als het tellen van 'brede karakters' of iets dergelijks.

Ik wil tekst die te lang wordt af laten breken, net als de grote kolom met het laatste nieuws etc. links op www.tweakers.net. Daar worden de regels heel efficient afgebroken, ze vullen bijna de hele regel. Hoe kan ik dit zelf bereiken?
Je zou het op twee manieren kunnen doen. De simpele manier is de tekst van het nieuws opbreken in 2 velden. Dus een introotje en de rest van de tekst. Op je hoofdpagina toon je alleen het intro, en in het bericht toon je allebei.

De tweede manier is om in de tekst vanaf de plek dat je zou willen afbreken zoeken naar de dichtstbijzijnde punt. Dan laat je de tekst vanaf het begin tot aan het moment dat die punt voorkomt zien op het scherm. Het makkelijkste is om een x aantal karakters terug te gaan vanaf de plek waar je wilt afbreken, omdat het kan zijn dat de punt net iets ervoor zit.

Dit is gewoon puur theorie, code heb ik niet voor je. Zou ik wel kunnen maken, maar misschien zet ik je hiermee al op een goed spoor.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat gebruik ik nu dus ook, maar hiermee gaat alles op een nogal ineffieciente manier. Het probleem is dat sommige karakters breder zijn dan anderen, en omdat ik koste wat kost wil voorkomen dat hij wrapped naar de volgende regel, is de enige manier (met substr dan) om alles vrij vroeg af te breken, zodat de goeden onder de slechten lijden zeg maar (lees: teveel zinnen worden veel te vroeg afgebroken)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
wustenveld schreef op 16 december 2003 @ 13:50:
[...]De tweede manier is om in de tekst vanaf de plek dat je zou willen afbreken zoeken naar de dichtstbijzijnde punt. Dan laat je de tekst vanaf het begin tot aan het moment dat die punt voorkomt zien op het scherm. Het makkelijkste is om een x aantal karakters terug te gaan vanaf de plek waar je wilt afbreken, omdat het kan zijn dat de punt net iets ervoor zit.
Dit snap ik even niet, kun je dit iets meer toelichten?

Acties:
  • 0 Henk 'm!

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 17-09 20:52

ripexx

bibs

Als je exact wil doen kun je het meten door middel van GD maar of dat nu echt efficient is? Ook kan je een waarde aan elke letter toekennen en die uitlezen en optellen. Bij T.net wordt er gewoon op letter afgebroken en niet op woorden. Voor het makelijk zou ik gewoon alle letters en cijfers een waarde toekennen en dan een functie schrijven die je de juiste string terug geeft. :)

buit is binnen sukkel


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
wat dacht je van de functie 'wrap'?
das een normale php functie.

je hebt alleen het probleem met spaties.. aangezien hij alleen 'breakt' op spaties en streepjes enzo, niet midden in een woord

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 07-07 13:36
Verwijderd schreef op 16 december 2003 @ 13:56:
[...]


Dit snap ik even niet, kun je dit iets meer toelichten?
Nog een manier zou overigens zijn om alleen de eerste alinea te tonen. Dus alles tussen de eerste <P> en </P> tonen.

Wat ik bedoel met m'n uitleg is dat je zeg maar alleen de eerste 300 karakters wilt tonen. Vanaf positie 300 in de tekst zoek je de dichtstbijzijnde punt (dus een punt na of voor teken 300). Als je die punt gevonden hebt weet je ook de positie van dat teken, en dan kun je door middel van substr($string,0,$positie); het eerste stuk tekst binnenhalen.

Je zou bijvoorbeeld kunnen zoeken op deze manier:
PHP:
1
2
3
4
5
$zoekfragment = substr($tekst,250,350);
$puntlocatie = strpos($zoekfragment,".");
$puntlocatie += 250; // omdat je de eerste 250 tekens nog mee moet tellen

echo substr($tekst,0,$puntlocatie);


De oplossing voor de eerste alinea zou je kunnen doen door iets als dit misschien
PHP:
1
2
3
$tekst = preg_replace("/\<P\>(.*?)\<\/P\>/is","\\1|");
$fragmenten = explode("|",$tekst);
echo $fragmenten[0];


Ik weet niet of het werkt, heb hier geen mogelijkheid om het te testen.

[ Voor 5% gewijzigd door wustenveld op 16-12-2003 14:31 ]


Acties:
  • 0 Henk 'm!

  • trogdor
  • Registratie: Mei 2003
  • Laatst online: 22-04 10:17
Als ik het goed begrijp gaat het hier helemaal niet om het exact aantal letters, maar om de precieze breedte, omdat het in een of andere tabel moet passen.
Volgens mij kan je dat in html oplossen.
Als je tabel een gefixeerde breedte geeft dan gaat je text vanzelf wrappen op de juiste plek.

Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb er zelf helaas ook nooit iets echt moois voor gevonden. Het probleem is namelijk dat letters niet altijd even breed zijn. Ik heb dus een gemiddelde genomen van het aantal characters wat op een regel past. Hierbij ga ik er van uit dat tekst altijd verschillende letters door elkaar zijn.

een soort funtie als eerder beschreven:
PHP:
1
2
3
4
5
6
7
8
9
 <? 
function text($data, $max){ 
$length = strlen($data); 
if($length>=$max){ 
$output = substr($data, 0, $max); 
return $output; 
} 
} 
?>  
Alleen dan nog uiteraard netjes op woorden afbreken en niet midden in een woord. 8)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ripexx schreef op 16 december 2003 @ 13:59:
Bij T.net wordt er gewoon op letter afgebroken en niet op woorden.
Op een vast aantal karakters bedoel je? Dat kan niet, daarvoor wordt alles veel te netjes vlak voor de rechterkant afgebroken. Heb ook even de karakters geteld van zinnen die daar afgebroken zijn, en die verschillen. Ik vraag me dus af hoe bepaald wordt na hoeveel karakters dat gebeurt...

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02

D2k

<hint>
terugkijken naar spaties
</hint>

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • WPN
  • Registratie: Augustus 2003
  • Laatst online: 24-07 21:14

WPN

ik heb het op deze manier werkend...


PHP:
1
2
3
4
5
6
7
8
9
10
11
<?
if ((strlen($stringhier)) < 10)
{
   $concattitel = $stringhier; 
}
else
{
  $concattitel = substr($stringhier,0,9);
  $concattitel = $concattitel."..";
}
?>


hier controlleer ik of de string langer is dan 10 posities
is die string langer dan 10 posities dan wordt ie afgebroken
en wordt er .. achter gezet

9 posities lang, vanaf de eerste (0) positie van de string


edit: [offtopic] hoe krijg je die verdomde kleurtjes in de code???? en ga me niet vertellen dat je bij bijna elk character zelf de kleurtjes invoert!!

edit2: w00t laat maar zitten, heb het al, inplaats van code moet ik php gebruiken :D

[ Voor 70% gewijzigd door WPN op 16-12-2003 15:31 ]

Als ik denk zoals ik dacht, dan doe ik zoals ik deed, als ik doe zoals ik deed, dan denk ik zoals ik dacht! Cogito Ergo Sum


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Peluso schreef op 16 december 2003 @ 15:26:
ik heb het op deze manier werkend...


PHP:
1
2
3
4
5
6
7
8
9
10
11
<?
if ((strlen($stringhier)) < 10)
{
   $concattitel = $stringhier; 
}
else
{
  $concattitel = substr($stringhier,0,9);
  $concattitel = $concattitel."..";
}
?>


9 posities lang, vanaf de eerste (0) positie van de string


edit: [offtopic] hoe krijg je die verdomde kleurtjes in de code???? en ga me niet vertellen dat je bij bijna elk character zelf de kleurtjes invoert!!

edit2: w00t laat maar zitten, heb het al, inplaats van code moet ik php gebruiken :D
[php] en [/php] :)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
function sSplit ($Zin, $AantalTekens)
{
      $aZin = explode (" ", $Zin);
      $Return = "";
      for ($i = 0; $i <= $AantalTekens; $i++)
      {
            $Return .= " " . $aZin[$i];
      }
      return ($Return);
}
echo sSplit ("lange zin hier, of hier of uhmmmmmmm hier?", 5);
?>

[ Voor 12% gewijzigd door PrisonerOfPain op 16-12-2003 15:38 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Peluso schreef op 16 december 2003 @ 15:26:hier controlleer ik of de string langer is dan 10 posities
is die string langer dan 10 posities dan wordt ie afgebroken
en wordt er .. achter gezet
Ja, maar dat heb ik dus al en dat werkt niet goed omdat niet elke letter even breed is. Als je alle zinnen afkapt op 10 karakters, zullen sommige zinnen breder zijn dan de andere, omdat er andere (bredere of smallere) karakters in kunnen zitten.

Acties:
  • 0 Henk 'm!

Verwijderd

PrisonerOfPain schreef op 16 december 2003 @ 15:35:
[...]


[php] en [/php] :)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
function sSplit ($Zin, $AantalTekens)
{
      $aZin = explode (" ", $Zin);
      $Return = "";
      for ($i = 0; $i <= $AantalTekens; $i++)
      {
            $Return .= " " . $aZin[$i];
      }
      return ($Return);
}
echo sSplit ("lange zin hier, of hier of uhmmmmmmm hier?", 5);
?>
Dat ding doet het op woorden, zelfde als join('',explode(' ',$string,5)); ofzo

Acties:
  • 0 Henk 'm!

  • HunterPro
  • Registratie: Juni 2001
  • Niet online
als je een vast font + size hebt, kun je ook nog het aantal pixels wat een letter + spacing nodig heeft in een flatfile of database opslaan, en aan de hand van de string opvragen hoeveel pixels ie zou worden, en 'm daar intelligent op laten afknippen :) (lekker nutteloos overdreven, I like it)

[ Voor 9% gewijzigd door HunterPro op 16-12-2003 16:01 ]


Acties:
  • 0 Henk 'm!

  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08 14:36
De simpele manier is afkappen op een bepaald aantal letters. Als je het mooier wil doen dan zal je zelf uit moeten zoeken hoe breed elke letter is. Dat hangt natuurlijk af van het font dat je gebruikt. Als je dat eenmaal uitgezocht hebt, dan kan je daarmee vrij nauwkeurig berekenen hoe breed een tekst gaat worden.

| Toen / Nu


Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 14:45
Wat jij wilt kan niet zo makkelijk door puur naar het aantal chars te kijken.

Wat je zou kunnen doen is voor het font dat je gebruikt kunnen 'meten' hoe breed ieder char is (relatief of absoluut). Je kan dan een opzoektabelletje maken in PHP met de breedte van ieder char. Vervolgens laat je PHP daarmee character voor character de breedte van een string uit reken. Bij een bepaalde breedte kun je um dan afkappen.

//edit:
LOL binnen 5 minuten 3x dezelfde oplossing :)

[ Voor 8% gewijzigd door Morrar op 16-12-2003 16:06 ]


Acties:
  • 0 Henk 'm!

  • HunterPro
  • Registratie: Juni 2001
  • Niet online
hee, ik denk dat je ook de breedte van de letters in een database kunt zetten, en dan dat gebruiken om slim af te knippen B) 8)7

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
We zijn nu inderdaad met iets bezig dat twee categorieen heeft "dikke letters" en "niet dikke letters", wat al een iets nauwkeurigere bnadering geeft. Een tabel maken van elke letter, is dat te doen? Ik had namelijk eens gehoord dat combinaties van letters ook nog ergens invloed op hadden, en dan leek het me iets teveel mogelijkheden worden...

Acties:
  • 0 Henk 'm!

  • HunterPro
  • Registratie: Juni 2001
  • Niet online
Verwijderd schreef op 16 december 2003 @ 16:11:
We zijn nu inderdaad met iets bezig dat twee categorieen heeft "dikke letters" en "niet dikke letters", wat al een iets nauwkeurigere bnadering geeft. Een tabel maken van elke letter, is dat te doen? Ik had namelijk eens gehoord dat combinaties van letters ook nog ergens invloed op hadden, en dan leek het me iets teveel mogelijkheden worden...
als je het font in ttf hebt kun je met gd een scriptje maken wat steeds een letter genereert, en met gd kun je dan weer de breedte van zo'n letter (en / of spacing) meten. Iets dergelijks heb ik ooit gemaakt om letters te kunnen fingerprinten om van een bepaalde site de mailadressen die als plaatjes online stonden, om te zetten naar plaintext O-) ;)

Tip: knippen dan op whitespace :)

Dan kun je die hele database dus geautomatiseerd laten genereren :)

[ Voor 6% gewijzigd door HunterPro op 16-12-2003 16:15 ]


Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 14:45
Verwijderd schreef op 16 december 2003 @ 16:11:
We zijn nu inderdaad met iets bezig dat twee categorieen heeft "dikke letters" en "niet dikke letters", wat al een iets nauwkeurigere bnadering geeft. Een tabel maken van elke letter, is dat te doen? Ik had namelijk eens gehoord dat combinaties van letters ook nog ergens invloed op hadden, en dan leek het me iets teveel mogelijkheden worden...
Volgens mij bedoel je de "kerning" (?) van een font... Maar ik weet niet of dat van toepassing is als je bijvoorbeeld gewoon Arial gebruikt. Dacht dat het meer voor handwriting/script fonts was.

Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 17-09 23:59

TeeDee

CQB 241

Ik heb het nu een poosje gelezen en volgens mij is het gewoon "justified" text plaatsen middels CSS.

Of ben ik nu gek? Je doet bijvoorbeeld na 250 letters afkappen (constructie verzinnen dat ie dat pas bij een (.) doet. Daarna met CSS justified plaatsen.

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29

Acties:
  • 0 Henk 'm!

  • HunterPro
  • Registratie: Juni 2001
  • Niet online

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
ik kan 'm zo snel niet vinden, maar ik weet heel zeker dat hier al eens een topic over geweest is (begin van dit jaar ofzo), waarbij iemand op een gegeven moment een functie heeft geschreven (in php) die een vrij aardige benadering maakte (zat er per regel maar iets van 2 naast ofzo).

Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb eigenlijk een soortgelijk probleem, alleen nog iets meer:

Ik gebruik het voor mijn CMS, en dan moeten de nieuws-items na een bepaald aantal in te stellen characters worden afgebroken. De strings kunnen dus pas worden afgebroken als de pagina wordt bekeken. Het probleem is echter dat er dan ook plaatjes voorkomen in de tekst, zoiets dus:
PHP:
1
$news_content = "Hey, moet je dit plaatje zien!! --> [img]\"plaatje.gif\"[/img] Wow dat is echt een leuk plaatje!!";

ik gebruik nu:
PHP:
1
2
3
4
5
6
        if ($_SETTINGS['afkappen'] == 1) { 
            if (strlen(strip_tags($news_content)) > $_SETTINGS['hoeveelafkappen']) { 
                $news_content = substr($news_content,0,$_SETTINGS['hoeveelafkappen']); 
                $news_content .= "... <a href='".$prefix."news_content.php?news_id=".$news_id."'>Lees verder</a>"; 
            } 
        }


Alleen als je hier afbreekt na 40 tekens, wordt er midden in de htmlcode afgebroken, en dat is natuurlijk niet de bedoeling.. Heeft iemand hier een oplossing voor??

[ Voor 8% gewijzigd door Verwijderd op 17-12-2003 11:31 ]


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 17-09 23:59

TeeDee

CQB 241

Met een regex de <img src= zut eruit halen?

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

ze moeten ook weer terug he..

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29
Misschien met preg_split zorgen dat je een array krijgt die er zo uitziet:
PHP:
1
2
3
4
5
6
7
8
9
10
<?php 
$array = array();
$array[0] = "blaat blaat";
$array[1] = "[img]'plaatje'[/img]";
$array[2] = "tekst";
?>

als je tekst dit is:

blaat blaat [img]'plaatje'[/img] tekst


Dus eventueel met explode oid splitsen op < en >. Vervolgens loop je door die array heen en tel je of de string nog past. Zoiets dus:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$langestring = "blaat blaat <br/> blaat <img/>";

$array = split_string_op($langestring);
// $array[0] = tekst
// $array[1] = htmltag?

$nstr = "";
foreach($array as $k=>$v) {
    // HTML-tags moeten helemaal niet worden getoond als ze worden afgekapt
    // teksttags wel

    if(strpos("<",$v)>-1) {
        // HTML tag
        if(strlen($nstr)+strlen($v)<$limit) {
            $nstr .= $v;
        }
    }
    else {
        $nstr .= substr($v,$limit-strlen($nstr));
    }
}


Zoals het hier staat werkt het nog niet, maar ik denk dat dit je wel op ideeen kan brengen :)

[ Voor 22% gewijzigd door MisterData op 18-12-2003 10:01 ]


Verwijderd

Tien minuutjes werk (breedtes bepaald met PS)...:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
  // breedtes van Tahoma 11 px non-capital
  $letterBreedtes = array
                (
                'a' => 6,
                'b' => 6,
                'c' => 5,
                'd' => 6,
                'e' => 6,
                'f' => 4,
                'g' => 6,
                'h' => 6,
                'i' => 2,
                'j' => 3,
                'k' => 5,
                'l' => 2,
                'm' => 8,
                'n' => 6,
                'o' => 6,
                'p' => 6,
                'q' => 6,
                'r' => 4,
                's' => 5,
                't' => 4,
                'u' => 6,
                'v' => 6,
                'w' => 8,
                'x' => 6,
                'y' => 6,
                'z' => 5
                );

  // formuliertje
  echo '<form method="post">';
  echo 'Geef een string op:<br>';
  echo '<input type="text" name="str" size="30"><br><br>';
  echo '<input type="submit" value="verzenden">';
  echo '</form>';

  // resultaat weergeven?
  if(isSet($_POST['str']))
  {

      // resultaat berekenen
      $lengte = 0;
      for($i=0;$i<strlen($_POST['str']);$i++)
      {

          $lengte+= $letterBreedtes[$_POST['str'][$i]];

      }

      // resultaat weergeven
      echo '<br><br><hr><br>';
      echo 'De volgende string:<br>';
      echo '<p style="display: inline; font-family: tahoma;';
echo 'font-size: 11px; color: red;">' . $_POST['str'] . '</p><br>';
      echo 'is <b>' . $lengte . '</b> pixels breed.';

  }


Is alleen met a-z, zonder spaties en cijfers (en gekke tekens, etc).
Succes!

[ Voor 25% gewijzigd door Verwijderd op 18-12-2003 10:38 ]


  • Thekk
  • Registratie: Augustus 2002
  • Laatst online: 12-09 06:07
Met een zoekopdracht met: string lengte en pixels vind je oa deze post:
[rml]BC3 Victim in "[ BC3] [ php] zin afbreken"[/rml]

Maakt gebruik van de gd library om de lengte van de string in pixels te berekenen... Misschien heb je hier iets aan?

Groeten,
Thekk

Ik heb geen zin om een sig te maken.


Acties:
  • 0 Henk 'm!

Verwijderd

de bedoeling is dus dat ik met preg_split mijn string in een array opsplits in HTML-tags en tekst. Dus dat ik zoiets krijg:

PHP:
1
2
3
$array[0] = "Blaat, blaat, ";
$array[1] = "[img]'schaap.gif'[/img]";
$array[2] = "Blaatschaap!";


Echter worden er dmv deze regel code:

PHP:
1
$news_array = preg_split("/(<)([^<>]*)(>)/",$news_content);


alleen 'gezuiverd' van HTML-tags :S
Ik heb al alle flags geprobeerd van http://nl3.php.net/preg_split maar deze zijn geen van allen goed... iemand een oplossing?

Acties:
  • 0 Henk 'm!

  • HunterPro
  • Registratie: Juni 2001
  • Niet online
je vraag is zó anders dan die van de TS, dat ik er een nieuw topic voor zou openen; ware het niet dat je dan dikke kans op een slotje hebt. Ik zou even in documentatie over regexen duiken; daar is genoeg hierover te vinden.
Pagina: 1