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?
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 = '@£$¥èéùìòçØøÅåΔ_ΦΓΛΩΠΨΣΘΞÆæßÉ !"#¤%&\'()*+,-./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