Avatar billede jenz3n Nybegynder
10. juni 2010 - 21:50 Der er 1 kommentar og
1 løsning

Find ulovlige tegn, strip dem, tæl en ny strengs værdi ud fra et map mellem tegn og værdier

Hej eksperter,

Min case er, at jeg skal udsende en brugerindtastet tekst ($text) på SMS.
Teksten der udsendes må kun indeholde tegnene: a, b, c, \n, \r og whitespace (mellemrum).
Tegnene a og c fylder 2, mens de resterende fylder 1.

Jeg har altså en tekst ($text), hvoraf jeg gerne vil udlede følgende:
1. Hvilke ulovlige tegn indgår i $text?
2. Hvor meget fylder $text (kun lovlige tegn tælles, og der tages højde for at nogle tegn fylder mere end 1)?
3. En ny tekst ($textStripped), hvori alle ulovlige tegn er fjernet.

En umiddelbar løsning ville se således ud:

$$text = 'adbc be';
$allowedChars = array(
    'a' => 2,
    'b' => 1,
    'c' => 2,
    "\n" => 1,
    "\r" => 1,
    ' ' => 1
);
$chars = str_split($text);
$illegalChars = array();
$allowedCharsValueCount = 0;
$textStripped = '';
foreach ($chars as $char) {
    if (array_key_exists($char,$allowedChars)) {
        $allowedCharsCount += $allowedChars[$char];
        $textStripped .= $char;
    } else {
        $illegalChars[] = $char;
    }
}
$illegalChars = array_unique($illegalChars);
echo '1. Følgende ulovlige tegn: ' . implode(' ',$illegalChars) . "\n";
echo '2.Teksten fylder i alt: ' . $allowedCharsCount . "\n";
echo '3. En strippet udgave af teksten: ' . $textStripped . "\n";

Mit spørgsmål er nu, om dette kan gøres mere elegant?
Eksempelvis bryder jeg mig ikke om at have tegnene som nøgler i listen, hvad siger i?
Avatar billede jenz3n Nybegynder
11. juni 2010 - 01:29 #1
Jeg har opdaget, at der er et problem ved ovenstående løsning, når eksempelvis man bruger tegn som æ, ø og å. Jeg tror det skyldes noget charset eller det faktum, at det står som key i arrayet. Jeg har nu lavet en ny løsning:

Læg mærke til at jeg har sat de reelle tegn ind, og at tegnene efter position 165, er dem, der fylder to.

$text = utf8_decode($_POST['text']);

$allowedChars = '@£$¥èéùìòçØøÅå&#916;_&#934;&#915;&#923;&#937;&#928;&#936;&#931;&#920;&#926;ÆæßÉ !"#¤%&\'()*+,-./0123456789:;<=>?¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà' . "\r\n" . '^{}\[~]|€';
$doubleChars =     '^{}\[~]|€';

$chars = str_split($text);
$illegalChars = array();
$allowedCharsValueCount = 0;
$textStripped = '';
foreach ($chars as $char) {
    $pos = strpos($allowedChars,$char);
    if ($pos !== false) {
        if ($pos > 165) $allowedCharsCount += 2;
        else $allowedCharsCount++;
        $textStripped .= $char;
    } else {
        $illegalChars[] = $char;
    }
}
$illegalChars = array_unique($illegalChars);
echo 'Følgende ulovlige tegn: ' . utf8_encode(implode(' ',$illegalChars)) . '<br />';
echo 'Teksten fylder i alt: ' . $allowedCharsCount . '<br />';
echo 'En strippet udgave af teksten: ' . utf8_encode($textStripped) . '<br />';

Jeg er lidt i tvivl om hvorfor jeg må anvende utf8_encode, men det var nødvendigt, for at få tegnene rigtige. Her kunne jeg godt bruge lidt redegørelse, for hvornår man bør benytte funktionen og dens søster utf8_decode. Alle mine filer er UTF8.

På forhånd tak
Avatar billede jenz3n Nybegynder
18. august 2010 - 17:29 #2
Æv :(
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