1: <?php
2:
3: /**
4: * Validates contents based on NMTOKENS attribute type.
5: */
6: class HTMLPurifier_AttrDef_HTML_Nmtokens extends HTMLPurifier_AttrDef
7: {
8:
9: /**
10: * @param string $string
11: * @param HTMLPurifier_Config $config
12: * @param HTMLPurifier_Context $context
13: * @return bool|string
14: */
15: public function validate($string, $config, $context)
16: {
17: $string = trim($string);
18:
19: // early abort: '' and '0' (strings that convert to false) are invalid
20: if (!$string) {
21: return false;
22: }
23:
24: $tokens = $this->split($string, $config, $context);
25: $tokens = $this->filter($tokens, $config, $context);
26: if (empty($tokens)) {
27: return false;
28: }
29: return implode(' ', $tokens);
30: }
31:
32: /**
33: * Splits a space separated list of tokens into its constituent parts.
34: * @param string $string
35: * @param HTMLPurifier_Config $config
36: * @param HTMLPurifier_Context $context
37: * @return array
38: */
39: protected function split($string, $config, $context)
40: {
41: // OPTIMIZABLE!
42: // do the preg_match, capture all subpatterns for reformulation
43:
44: // we don't support U+00A1 and up codepoints or
45: // escaping because I don't know how to do that with regexps
46: // and plus it would complicate optimization efforts (you never
47: // see that anyway).
48: $pattern = '/(?:(?<=\s)|\A)' . // look behind for space or string start
49: '((?:--|-?[A-Za-z_])[A-Za-z_\-0-9]*)' .
50: '(?:(?=\s)|\z)/'; // look ahead for space or string end
51: preg_match_all($pattern, $string, $matches);
52: return $matches[1];
53: }
54:
55: /**
56: * Template method for removing certain tokens based on arbitrary criteria.
57: * @note If we wanted to be really functional, we'd do an array_filter
58: * with a callback. But... we're not.
59: * @param array $tokens
60: * @param HTMLPurifier_Config $config
61: * @param HTMLPurifier_Context $context
62: * @return array
63: */
64: protected function filter($tokens, $config, $context)
65: {
66: return $tokens;
67: }
68: }
69:
70: // vim: et sw=4 sts=4
71: