10. marts 2007 - 01:27Der er
7 kommentarer og 2 løsninger
Rækkefølge på tegnformattering (ved $_POST)
Hej!
Jeg har et forum, der har nogle små funktioner: - Links bliver klikbare - Tegn formatteres Fx. ø->æ - Wordwrap: Ord der er længere end 100 tegn deles op (så de ikke ødelægger tabellen)
Jeg har dog det problem, at hvis man skriver bøøøø! bliver det opfattet som bææææ! Hvis man derfor skriver bøøøøøøøøøøøøøøøøø bliver ordet rigtig langt, og dermed bliver det delt op så der kommer til at stå bøøøøø øøøøøøøø - hvis man er heldig! Hvis man er uheldig bliver æ også delt op og det ser rigtig grimt ud!
Jeg kan desværre ikke sætte wordwrap'en først, da lange links på denne måde vil blive ødelagt.
BONUSINFO: Så snart links er klikbare, vil de ikke bliver delt op, da wordwrap'en undgår <a tagget. Men da æ ikke er noget tag, ved jeg ikke helt hvordan jeg skal gribe sagen an.
Resume: I mit forum bliver halvlange ord delt op hvis de indeholder specialtegn.
Her har jeg lige krykket et script sammen: $str = "bæææææhæææææ hejmesssddddddddddddddddig <a href=blabla>Hej</a> jjjjj"; echo WrapLine(10, $str);
// Gennemløber strengen karakter for karakter for ($i = 0; $i < strlen($string);$i++) { // Skriver karakteren ned i bufferen $result .= $string[$i];
// Kontrollerer om vi er i en html blok (Undersøges længere nede) if ($inHtml) { if ($string[$i] == '>') { $inKey = false; } } // Kontrollerer om vi er i en & blok (Undersøges længere nede) else if ($inAmp) { if ($string[$i] == ';') { $inAmp = false; } } // Ellers er vi i begyndelsen af et symbol eller på en alm karakter else { // Kontrollerer lige om vi står på et space if ($string[$i] == ' ') { // Nulstiller tælleren hvis vi er på et space $charCount = 0; continue; }
// Kontrollerer om vi er i starten af et html tag if ($string[$i] == '<') { $inHtml = true; } // Kontrollerer om vi er i starten på en & symbol (Vi tæller en karakter hvis vi er et symbol unanset længden) else if ($string[$i] == '&') { $inAmp = true; $charCount++; } // Ellers tæller vi bare vores karakterer siden sidste space else { $charCount++;
// Kontrollerer om vi skal tilføje et space, og nulstille if ($charCount >= $length) { $result .= " "; $charCount = 0; } } } } return $result; }
// Gennemløber strengen karakter for karakter for ($i = 0; $i < strlen($string);$i++) { // Skriver karakteren ned i bufferen $result .= $string[$i];
// Kontrollerer om vi er i en html blok (Undersøges længere nede) if ($inHtml) { if ($string[$i] == '>') { $inHtml = false; } } // Kontrollerer om vi er i en & blok (Undersøges længere nede) else if ($inAmp) { if ($string[$i] == ';') { $inAmp = false; } } // Ellers er vi i begyndelsen af et symbol eller på en alm karakter else { // Kontrollerer lige om vi står på et space if ($string[$i] == ' ') { // Nulstiller tælleren hvis vi er på et space $charCount = 0; continue; }
// Kontrollerer om vi er i starten af et html tag if ($string[$i] == '<') { $inHtml = true; } // Kontrollerer om vi er i starten på en & symbol (Vi tæller en karakter hvis vi er et symbol unanset længden) else if ($string[$i] == '&') { $inAmp = true; $charCount++; } // Ellers tæller vi bare vores karakterer siden sidste space else { $charCount++;
// Kontrollerer om vi skal tilføje et space, og nulstille if ($charCount >= $length) { $result .= " "; $charCount = 0; } } } } return $result; }
og resultatet bliver: bæææææhæææææ hejmesssdd dddddddddd ddddig Hej jjjjjkkkkk kdmm
Dvs den tæller ikke karakterer hvis det er html(Der kan jo sagtens være en masse formaterings html du ikke vil tælle med feks <b> osv) og den tæller én karakter hvis det er et symbol. ;)
Wow! Det er rigtig flot arbejde! Mange tak skal du have!
Jeg vil gerne bede dig om én ting til (hvis det er muligt): Jeg kunne godt tænke mig det således, at ordet stadig blev delt op, selvom det indeholder specialtegn (æ) Hvis man nu skriver bææææææææææææææææææææææææææææææææææææ bliver tabellen/designet ødelagt, da den ikke bliver delt op. (den skal bare ikke deles midt i æ) Det er perfekt at æ nu kun tælles som et enkelt tegn!
// Gennemløber strengen karakter for karakter for ($i = 0; $i < strlen($string);$i++) { // Skriver karakteren ned i bufferen $result .= $string[$i];
// Kontrollerer om vi er i en html blok (Undersøges længere nede) if ($inHtml) { if ($string[$i] == '>') { $inHtml = false; } } // Kontrollerer om vi er i en & blok (Undersøges længere nede) else if ($inAmp) { if ($string[$i] == ';') { $inAmp = false; } } // Ellers er vi i begyndelsen af et symbol eller på en alm karakter else { // Kontrollerer lige om vi står på et space if ($string[$i] == ' ') { // Nulstiller tælleren hvis vi er på et space $charCount = 0; continue; }
// Kontrollerer om vi er i starten af et html tag if ($string[$i] == '<') { $inHtml = true; } // Kontrollerer om vi er i starten på en & symbol (Vi tæller en karakter hvis vi er et symbol unanset længden) else if ($string[$i] == '&') { $inAmp = true; $charCount++; } // Ellers tæller vi bare vores karakterer siden sidste space else { $charCount++; } } // Kontrollerer om vi skal tilføje et space, og nulstille if ($charCount >= $length && !$inHtml && !$inAmp) { $result .= " "; $charCount = 0; } } return $result; }
Du får lige en forbedring med i hatten, den skal selvfølgelig nulstille counteren så alle former for whitespace, eller bliver det nogle korte ord efter et linje skift: $str = "\t\r\nTest fpor tab\ttzb\ttsb\tbæææææhæææææ hejmesssddddddddddddddddig <a href=blabla>Hej</a> jjjjjkkkkkkdmm eeeeee eeeeeeeeeeeeeeeeeeeeeeeee eeeee eeeeeeeeeeeeddddeeeee";
// Gennemløber strengen karakter for karakter for ($i = 0; $i < strlen($string);$i++) { // Skriver karakteren ned i bufferen $result .= $string[$i];
// Kontrollerer om vi er i en html blok (Undersøges længere nede) if ($inHtml) { if ($string[$i] == '>') { $inHtml = false; } } // Kontrollerer om vi er i en & blok (Undersøges længere nede) else if ($inAmp) { if ($string[$i] == ';') { $inAmp = false; } } // Ellers er vi i begyndelsen af et symbol eller på en alm karakter else { // Kontrollerer lige om vi står på et space if (ctype_space($string[$i])) { // Nulstiller tælleren hvis vi er på et space $charCount = 0; continue; }
// Kontrollerer om vi er i starten af et html tag if ($string[$i] == '<') { $inHtml = true; } // Kontrollerer om vi er i starten på en & symbol (Vi tæller en karakter hvis vi er et symbol unanset længden) else if ($string[$i] == '&') { $inAmp = true; $charCount++; } // Ellers tæller vi bare vores karakterer siden sidste space else { $charCount++; } } // Kontrollerer om vi skal tilføje et space, og nulstille if ($charCount >= $length && !$inHtml && !$inAmp) { $result .= " "; $charCount = 0; } } return $result; }
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.