45 $this->_search = $search;
46 $this->_index = array();
47 $this->_tree = array();
48 $this->_replace = array();
49 $this->_repSize = array();
53 $last_size = $size = 0;
54 foreach ($search as $i => $search_element) {
56 $tree[-1] = min(count($replace) - 1, $i - 1);
57 $tree[-2] = $last_size;
60 if (is_array($search_element)) {
61 foreach ($search_element as $k => $char) {
62 $this->_index[$char] =
true;
63 if (!isset($tree[$char])) {
64 $tree[$char] = array();
66 $tree = &$tree[$char];
69 $size = max($size, $last_size);
72 if (!isset($tree[$search_element])) {
73 $tree[$search_element] = array();
75 $tree = &$tree[$search_element];
76 $size = max($last_size, $size);
77 $this->_index[$search_element] =
true;
81 $tree[-1] = min(count($replace) - 1, $i);
82 $tree[-2] = $last_size;
83 $this->_treeMaxLen = $size;
85 foreach ($replace as $rep) {
86 if (!is_array($rep)) {
89 $this->_replace[] = $rep;
91 for ($i = count($this->_replace) - 1; $i >= 0; --$i) {
92 $this->_replace[$i] = $rep = $this->
filter($this->_replace[$i], $i);
93 $this->_repSize[$i] = count($rep);
106 $endOfBuffer = end($buffer);
108 return isset($this->_index[$endOfBuffer]);
119 public function filter($buffer, $_minReplaces = -1)
121 if ($this->_treeMaxLen == 0) {
125 $newBuffer = array();
126 $buf_size = count($buffer);
127 for ($i = 0; $i < $buf_size; ++$i) {
129 $last_found = PHP_INT_MAX;
133 if (isset($buffer [$p = $i + $j]) && isset($search_pos[$buffer[$p]])) {
134 $search_pos = $search_pos[$buffer[$p]];
136 if (isset($search_pos[-1]) && $search_pos[-1] < $last_found
137 && $search_pos[-1] > $_minReplaces) {
138 $last_found = $search_pos[-1];
139 $last_size = $search_pos[-2];
143 elseif ($last_found !== PHP_INT_MAX) {
145 $rep_size = $this->_repSize[$last_found];
146 for ($j = 0; $j < $rep_size; ++$j) {
147 $newBuffer[] = $this->_replace[$last_found][$j];
150 $i += $last_size - 1;
152 if ($i >= $buf_size) {
153 $newBuffer[] = $buffer[$i];
164 $newBuffer[] = $buffer[$i];