Thu 27 Feb 2003 02:55:40 PM UTC, original submission:
Så här ser funktionen ampersand() ut i sitt nuvarande skick:
function ampersand($str) {
$str = ereg_replace('&', '&', $str);
$str = ereg_replace('&([a-z]+;)', '&\\1', $str);
return $str;
}
Uppenbart vill man tillåta HTML-entities, men man är allt för restriktiv. Även Ä för stora Ä eller ¼ för en fjärdedel utesluts, vilket även skrivsätt som æ (æ) och andra görs.
Föreslagen lösning:
function ampersand($str) {
$str = str_replace("&", "&", $str);
$str = eregi_replace("&(#x?[0-9a-f]+;)", "&\\1", $str);
$str = eregi_replace("&([a-z][a-z0-9]+;)", "&\\1", $str);
return $str;
}
Skilnaden är dels case-sensitive, dels att även ŋ (fonetiskt ng-tecken som i "ring") och ¾ (tre fjärdedelar) tillåts.
Buggar i den nya algoritmen: även B; tillåts, trots att hexadecimala tal kräver ett x framför; och att den är lite för restriktiv gällande entities av typen ³ (upphöjd trea) som enligt XML-standarden även får innehålla bindestreck, punkter, med mera. Ingen av de i HTML 4 definierade entities gör detta, vilket borde göra mitt antagande säkert.
|