bezorg de laatste berichten direct op de desktop
Welkom, Gast
Alstublieft Inloggen of Registreren.    Wachtwoord verloren?

Geavanceerde wordwrap() maken
(1 bezoeker) (1) Gast
Ga naar onderkantPagina: 1234
TOPIC: Geavanceerde wordwrap() maken
#2814
Geavanceerde wordwrap() maken 4 Jaren, 7 Maanden geleden Karma: 0
Na 4 maanden heb ik al mn moed samengeraapt om het bekende wordwrap()-fenomeen/probleem op te lossen. Ik schets ff een korte geschiedenis:

In den beginne was er de standaard PHP-functie:

[php]
<?= bbcode(wordwrap($data['bericht'], 200, "<br />",1)); ?>
[/php]

Al gauw bleek dat deze functie langs geen kanten werkte (het werkte wel, maar niet naar behoren). Na wat zoeken op het net vond ik nog allerlei mensen die aanliepen tegen de beperkingen van deze standaard PHP-functie. Zo kwam ik een geavanceerdere functie tegen die niet op het aantal tekens wrapped, maar enkel op lange woorden. Voor mij was dit een echte aha-erlebnis en ik testte deze functie dan ook uitvoerig uit:

[php]
<?php
// deze functie vervangt de gebrekkige wordwrap() functie
// deze functie breekt aparte woorden af wanneer ze langer zijn dan een aantal tekens
// ik heb deze functie grondig getest en ze werkt perfect, zowel bij de w (langste teken) als de i (kortste teken)
// het langste woord dat bestaat is ongeveer 50 tekens, dus als je wordwrapped op 50 kan dit geen problemen geven
function cut_word($txt, $where) {
if (empty($txt)) return false;
for ($c = 0, $a = 0, $g = 0; $c<strlen($txt); $c++) {
$d[$c+$g]=$txt[$c];
if ($txt[$c]!=" ") $a++;
else if ($txt[$c]==" ") $a = 0;
if ($a==$where) {
$g++;
$d[$c+$g]="<br />";
$a = 0;
}
}
return implode("", $d);
}

echo bbcode(cut_word($data['bericht'], 60));
?>
[/php]

Deze functie lostte in ieder geval al het probleem op dat ik had met wordwrap(). Nu heb ik nog een (bijkomend) probleem. Een woord zal nooit langer worden dan 60 tekens, maar in een bericht zitten ook html-codes zoals hyperlinks. Als je dan een hyperlink ingeeft die langer is dan 60 tekens (en dat komt dikwijls voor) wordt deze hyperlink afgebroken.

Hier zou ik een oplossing voor willen hebben. Ik zou een functie moeten schrijven die dus voortbouwt op bovenstaande functie, maar die < en > herkent en dan niet de wordwrapfunctie toepast op de delen die tussen < en > staan (maar wel op de andere tekst).
Hoe kan dat?

Een echte uitdaging voor de PHP-programmeur
wimvd
Nieuwe Gebruiker
Berichten: 0
graphgraph
Gebruiker offline Klik hier om het gebruikersprofiel van deze gebruiker te zien
De Administrator heeft publieke schrijf toegang geblokkeerd.
 
#2824
4 Jaren, 7 Maanden geleden Karma: 0
Ik hou wel van een uitdaging dus ik ben gaan proberen!

Alleen, wat heb je er aan als een zin alleen wordt afgebroken na een lang woord? Dan krijg je toch nog steeds heel erg lange zinnen?

En wat doet die functie bbcode precies?

De rest van je script heb ik iets overzichtelijker gemaakt, zodat je tenminste een beetje ziet wat er gebeurd, maar volgens mij doet hij nog precies hetzelfde...

[php]<?php
function cut_word($input, $limit)
{
if (empty($input))
{
return FALSE;
}
else
{
$length = 0;
$output = array();
for ($i = 0; $i < strlen($input); $i++)
{
$current = substr($input, $i, 1);
$output[] = $current;
if ($current != ' ')
{
$length++;
}
else
{
if ($current == ' ')
{
$length = 0;
}
}
if ($length == $limit)
{
$output[] = '<br />';
$length = 0;
}
}
return implode('', $output);
}
}

$text = 'Dit is een heel lang bericht dat niet op een regel past! Ik zet er express geen enters tussen zodat ik zo mogelijk de layout verknal! Hier komt het lange woord: Hottentottententententoonstelling.';
echo cut_word($text, 60);
?>[/php]
Rik
Moderator
Berichten: 28
graphgraph
Gebruiker offline Klik hier om het gebruikersprofiel van deze gebruiker te zien
De Administrator heeft publieke schrijf toegang geblokkeerd.
 
#2825
4 Jaren, 7 Maanden geleden Karma: 0
je zou met strpos() posities kunnen bepalen van < en > en de hand daarvan kijken of je wilt wrappen
Zoiets ofzo:
[code:xi7zrlzr]
$pos = strpos ($mystring, "<");
$postwee = strpos ($mystring, ">");
if ($pos === false && $postwee === FALSE ) {
//hier je shit
}
[/code:xi7zrlzr]
_arno_
WMS Fan
Berichten: 16
graphgraph
Gebruiker offline Klik hier om het gebruikersprofiel van deze gebruiker te zien
De Administrator heeft publieke schrijf toegang geblokkeerd.
 
#2828
4 Jaren, 7 Maanden geleden Karma: 0
[quote="rik":iiva4ld1]Ik hou wel van een uitdaging dus ik ben gaan proberen!

Alleen, wat heb je er aan als een zin alleen wordt afgebroken na een lang woord? Dan krijg je toch nog steeds heel erg lange zinnen?

En wat doet die functie bbcode precies?

De rest van je script heb ik iets overzichtelijker gemaakt, zodat je tenminste een beetje ziet wat er gebeurd, maar volgens mij doet hij nog precies hetzelfde...

[php]<?php
function cut_word($input, $limit)
{
if (empty($input))
{
return FALSE;
}
else
{
$length = 0;
$output = array();
for ($i = 0; $i < strlen($input); $i++)
{
$current = substr($input, $i, 1);
$output[] = $current;
if ($current != ' ')
{
$length++;
}
else
{
if ($current == ' ')
{
$length = 0;
}
}
if ($length == $limit)
{
$output[] = '<br />';
$length = 0;
}
}
return implode('', $output);
}
}

$text = 'Dit is een heel lang bericht dat niet op een regel past! Ik zet er express geen enters tussen zodat ik zo mogelijk de layout verknal! Hier komt het lange woord: Hottentottententententoonstelling.';
echo cut_word($text, 60);
?>[/php][/quote:iiva4ld1]

Je begrijpt het verkeerd. Niet de zin wordt afgebroken, maar het lange woord wordt afgebroken.
wimvd
Nieuwe Gebruiker
Berichten: 0
graphgraph
Gebruiker offline Klik hier om het gebruikersprofiel van deze gebruiker te zien
De Administrator heeft publieke schrijf toegang geblokkeerd.
 
#2829
4 Jaren, 7 Maanden geleden Karma: 0
[quote="_arno_":2jsyk0u0]je zou met strpos() posities kunnen bepalen van < en > en de hand daarvan kijken of je wilt wrappen
Zoiets ofzo:
[code:2jsyk0u0]
$pos = strpos ($mystring, "<");
$postwee = strpos ($mystring, ">");
if ($pos === false && $postwee === FALSE ) {
//hier je shit
}
[/code:2jsyk0u0][/quote:2jsyk0u0]

Ja, maar het is niet zo dat er NIET moet gewrapt worden als er < of > in voorkomt. Het deel dat tussen < en > moet niet gewrapt worden, maar de rest van het bericht wel eh...
wimvd
Nieuwe Gebruiker
Berichten: 0
graphgraph
Gebruiker offline Klik hier om het gebruikersprofiel van deze gebruiker te zien
De Administrator heeft publieke schrijf toegang geblokkeerd.
 
#2832
4 Jaren, 7 Maanden geleden Karma: 0
met de 2 posities kun je met substr bv de html er tijdelijk uitknippen en na je wordwrap er weer inzetten.

Helaas heb ik weinig tijd om hier mooie functie van te maken, anders zou ik het voor je doen
_arno_
WMS Fan
Berichten: 16
graphgraph
Gebruiker offline Klik hier om het gebruikersprofiel van deze gebruiker te zien
De Administrator heeft publieke schrijf toegang geblokkeerd.
 
Ga naar bovenkantPagina: 1234
Moderators: Rik, Roy