private static function check_attr_value($k, $v, $type)
{
if (is_array($type)) {
// array of allowed values, exact matches only
return in_array($v, $type, true);
} else {
// data type
switch ($type) {
case 'uri':
// RfC 2396 <http://www.ietf.org/rfc/rfc2396.txt>
$bits = self::parse_url($v);
return $bits['is_relative'] || in_array($bits['scheme'], self::$whitelist_protocols);
break;
case 'language-code':
// RfC 1766 <http://www.ietf.org/rfc/rfc1766.txt>
// Language-Tag = Primary-tag *( "-" Subtag )
// Primary-tag = 1*8ALPHA
// Subtag = 1*8ALPHA
return preg_match('/^[a-zA-Z]{1,8}(?:-[a-zA-Z]{1,8})*$/i', $v);
break;
case 'text':
// XXX is this sufficient?
return is_string($v);
break;
case 'datetime':
// <http://www.w3.org/TR/1998/NOTE-datetime-19980827>
// <http://www.w3.org/TR/html4/types.html#h-6.11>
// YYYY-MM-DDThh:mm:ssTZD
return preg_match('/^[0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9]:[0-5][0-9]:[0-5][0-9](?:Z|[\\+-][0-2][0-9]:[0-5][0-9])$/', $v);
break;
default:
Error::raise(_t('Unknown attribute type "%s" in %s', array($type, __CLASS__)));
return false;
}
}
}