Avatar billede phpbegynder2004 Nybegynder
10. marts 2007 - 01:27 Der 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 &aelig; 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.
Avatar billede twm Nybegynder
10. marts 2007 - 02:11 #1
Hej

Her har jeg lige krykket et script sammen:
$str = "b&aelig;&aelig;&aelig;&aelig;&aelig;h&aelig;&aelig;&aelig;&aelig;&aelig; hejmesssddddddddddddddddig <a href=blabla>Hej</a> jjjjj";
echo WrapLine(10, $str);

function WrapLine($length, $string)
{
    $result = "";
    $inHtml = false;
    $inAmp = false;
    $charCount = 0;
   
    // 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;
}

Mvh
Torben
Avatar billede twm Nybegynder
10. marts 2007 - 02:12 #2
og resultatet bliver:
bæææææhæææææ hejmesssdd dddddddddd ddddig Hej jjjjj
Avatar billede twm Nybegynder
10. marts 2007 - 02:22 #3
Der var lige en stavefejl i den ene variabel, jeg fik ikke stoppet tælleren ved html slut tagget:

$str = "b&aelig;&aelig;&aelig;&aelig;&aelig;h&aelig;&aelig;&aelig;&aelig;&aelig; hejmesssddddddddddddddddig <a href=blabla>Hej</a> jjjjjkkkkkkdmm";
echo WrapLine(10, $str);

function WrapLine($length, $string)
{
    $result = "";
    $inHtml = false;
    $inAmp = false;
    $charCount = 0;
   
    // 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. ;)
Avatar billede phpbegynder2004 Nybegynder
10. marts 2007 - 02:50 #4
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 (&aelig;)
Hvis man nu skriver bææææææææææææææææææææææææææææææææææææ bliver tabellen/designet ødelagt, da den ikke bliver delt op. (den skal bare ikke deles midt i &aelig;)
Det er perfekt at æ nu kun tælles som et enkelt tegn!
Avatar billede twm Nybegynder
10. marts 2007 - 03:01 #5
Sorry :S fik den lige ødelagt da jeg ryddede op :)

$str = "b&aelig;&aelig;&aelig;&aelig;&aelig;h&aelig;&aelig;&aelig;&aelig;&aelig; hejmesssddddddddddddddddig <a href=blabla>Hej</a> jjjjjkkkkkkdmm";
echo WrapLine(10, $str);
echo "<br>";
echo WrapLine2(10, $str);

function WrapLine($length, $string)
{
    $result = "";
    $inHtml = $inAmp = false;
    $charCount = 0;
   
    // 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;
}

resultat:
bæææææhæææ ææ hejmesssdd dddddddddd ddddig Hej jjjjjkkkkk kdmm
Avatar billede twm Nybegynder
10. marts 2007 - 03:03 #6
se lige bort fra:
echo "<br>";
echo WrapLine2(10, $str);

det var lidt debug kode
:)
Avatar billede twm Nybegynder
10. marts 2007 - 09:57 #7
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&aelig;&aelig;&aelig;&aelig;&aelig;h&aelig;&aelig;&aelig;&aelig;&aelig; hejmesssddddddddddddddddig <a href=blabla>Hej</a> jjjjjkkkkkkdmm
eeeeee
eeeeeeeeeeeeeeeeeeeeeeeee
eeeee
eeeeeeeeeeeeddddeeeee";

echo WrapLine(10, $str);

function WrapLine($length, $string)
{
    $result = "";
    $inHtml = $inAmp = false;
    $charCount = 0;
   
    // 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;
}

resultat:
   
Test fpor tab    tzb    tsb    b&aelig;&aelig;&aelig;&aelig;&aelig;h&aelig;&aelig;&aelig; &aelig;&aelig; hejmesssdd dddddddddd ddddig <a href=blabla>Hej</a> jjjjjkkkkk kdmm
eeeeee
eeeeeeeeee eeeeeeeeee eeeee
eeeee
eeeeeeeeee eeddddeeee e
Avatar billede phpbegynder2004 Nybegynder
10. marts 2007 - 13:09 #8
Mange tak! Virkelig flot arbejde!
Avatar billede twm Nybegynder
10. marts 2007 - 13:32 #9
tak for point ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester