ILIAS  Release_5_0_x_branch Revision 61816
 All Data Structures Namespaces Files Functions Variables Groups Pages
ID.php
Go to the documentation of this file.
1 <?php
2 
13 {
14 
15  // selector is NOT a valid thing to use for IDREFs, because IDREFs
16  // *must* target IDs that exist, whereas selector #ids do not.
17 
23  protected $selector;
24 
28  public function __construct($selector = false)
29  {
30  $this->selector = $selector;
31  }
32 
39  public function validate($id, $config, $context)
40  {
41  if (!$this->selector && !$config->get('Attr.EnableID')) {
42  return false;
43  }
44 
45  $id = trim($id); // trim it first
46 
47  if ($id === '') {
48  return false;
49  }
50 
51  $prefix = $config->get('Attr.IDPrefix');
52  if ($prefix !== '') {
53  $prefix .= $config->get('Attr.IDPrefixLocal');
54  // prevent re-appending the prefix
55  if (strpos($id, $prefix) !== 0) {
56  $id = $prefix . $id;
57  }
58  } elseif ($config->get('Attr.IDPrefixLocal') !== '') {
59  trigger_error(
60  '%Attr.IDPrefixLocal cannot be used unless ' .
61  '%Attr.IDPrefix is set',
62  E_USER_WARNING
63  );
64  }
65 
66  if (!$this->selector) {
67  $id_accumulator =& $context->get('IDAccumulator');
68  if (isset($id_accumulator->ids[$id])) {
69  return false;
70  }
71  }
72 
73  // we purposely avoid using regex, hopefully this is faster
74 
75  if (ctype_alpha($id)) {
76  $result = true;
77  } else {
78  if (!ctype_alpha(@$id[0])) {
79  return false;
80  }
81  // primitive style of regexps, I suppose
82  $trim = trim(
83  $id,
84  'A..Za..z0..9:-._'
85  );
86  $result = ($trim === '');
87  }
88 
89  $regexp = $config->get('Attr.IDBlacklistRegexp');
90  if ($regexp && preg_match($regexp, $id)) {
91  return false;
92  }
93 
94  if (!$this->selector && $result) {
95  $id_accumulator->add($id);
96  }
97 
98  // if no change was made to the ID, return the result
99  // else, return the new id if stripping whitespace made it
100  // valid, or return false.
101  return $result ? $id : false;
102  }
103 }
104 
105 // vim: et sw=4 sts=4