Coverage for Doctrine_Tokenizer

Back to coverage report

1 <?php
2 /*
3  *  $Id: From.php 1080 2007-02-10 18:17:08Z romanb $
4  *
5  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
6  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
7  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
8  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
9  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
10  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
11  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
12  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
13  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
14  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
15  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
16  *
17  * This software consists of voluntary contributions made by many individuals
18  * and is licensed under the LGPL. For more information, see
19  * <http://www.phpdoctrine.org>.
20  */
21
22 /**
23  * Doctrine_Tokenizer
24  *
25  * @package     Doctrine
26  * @subpackage  Tokenizer
27  * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
28  * @link        www.phpdoctrine.org
29  * @since       1.0
30  * @version     $Revision: 1080 $
31  * @author      Konsta Vesterinen <kvesteri@cc.hut.fi>
32  */
33 class Doctrine_Tokenizer 
34 {
35     /**
36      * trims brackets
37      *
38      * @param string $str
39      * @param string $e1        the first bracket, usually '('
40      * @param string $e2        the second bracket, usually ')'
41      */
42     public static function bracketTrim($str, $e1 = '(', $e2 = ')')
43     {
44         if (substr($str, 0, 1) === $e1 && substr($str, -1) === $e2) {
45             return substr($str, 1, -1);
46         } else {
47             return $str;
48         }
49     }
50
51     /**
52      * bracketExplode
53      *
54      * example:
55      *
56      * parameters:
57      *      $str = (age < 20 AND age > 18) AND email LIKE 'John@example.com'
58      *      $d = ' AND '
59      *      $e1 = '('
60      *      $e2 = ')'
61      *
62      * would return an array:
63      *      array("(age < 20 AND age > 18)",
64      *            "email LIKE 'John@example.com'")
65      *
66      * @param string $str
67      * @param string $d         the delimeter which explodes the string
68      * @param string $e1        the first bracket, usually '('
69      * @param string $e2        the second bracket, usually ')'
70      *
71      */
72     public static function bracketExplode($str, $d = ' ', $e1 = '(', $e2 = ')')
73     {
74         if (is_array($d)) {
75             $a = preg_split('/('.implode('|', $d).')/', $str);
76             $d = stripslashes($d[0]);
77         } else {
78             $a = explode($d, $str);
79         }
80
81         $i = 0;
82         $term = array();
83         foreach($a as $key=>$val) {
84             if (empty($term[$i])) {
85                 $term[$i] = trim($val);
86                 $s1 = substr_count($term[$i], $e1);
87                 $s2 = substr_count($term[$i], $e2);
88                 
89                 if ($s1 == $s2) {
90                     $i++;
91                 }
92             } else {
93                 $term[$i] .= $d . trim($val);
94                 $c1 = substr_count($term[$i], $e1);
95                 $c2 = substr_count($term[$i], $e2);
96                 
97                 if ($c1 == $c2) { 
98                     $i++;
99                 }
100             }
101         }
102         return $term;
103     }
104
105     /**
106      * quoteExplode
107      *
108      * example:
109      *
110      * parameters:
111      *      $str = email LIKE 'John@example.com'
112      *      $d = ' AND '
113      *
114      * would return an array:
115      *      array("email", "LIKE", "'John@example.com'")
116      *
117      * @param string $str
118      * @param string $d         the delimeter which explodes the string
119      */
120     public static function quoteExplode($str, $d = ' ')
121     {
122         if (is_array($d)) {
123             $a = preg_split('/('.implode('|', $d).')/', $str);
124             $d = stripslashes($d[0]);
125         } else {
126             $a = explode($d, $str);
127         }
128
129         $i = 0;
130         $term = array();
131         foreach ($a as $key => $val) {
132             if (empty($term[$i])) {
133                 $term[$i] = trim($val);
134
135                 if ( ! (substr_count($term[$i], "'") & 1)) {
136                     $i++;
137                 }
138             } else {
139                 $term[$i] .= $d . trim($val);
140
141                 if ( ! (substr_count($term[$i], "'") & 1)) {
142                     $i++;
143                 }
144             }
145         }
146         return $term;
147     }
148
149     /**
150      * sqlExplode
151      *
152      * explodes a string into array using custom brackets and
153      * quote delimeters
154      *
155      *
156      * example:
157      *
158      * parameters:
159      *      $str = "(age < 20 AND age > 18) AND name LIKE 'John Doe'"
160      *      $d   = ' '
161      *      $e1  = '('
162      *      $e2  = ')'
163      *
164      * would return an array:
165      *      array('(age < 20 AND age > 18)',
166      *            'name',
167      *            'LIKE',
168      *            'John Doe')
169      *
170      * @param string $str
171      * @param string $d         the delimeter which explodes the string
172      * @param string $e1        the first bracket, usually '('
173      * @param string $e2        the second bracket, usually ')'
174      *
175      * @return array
176      */
177     public static function sqlExplode($str, $d = ' ', $e1 = '(', $e2 = ')')
178     {
179         if ($d == ' ') {
180             $d = array(' ', '\s');
181         }
182         if (is_array($d)) {
183             $d = array_map('preg_quote', $d);
184
185             if (in_array(' ', $d)) {
186                 $d[] = '\s';
187             }
188
189             $split = '§(' . implode('|', $d) . ')§';
190
191             $str = preg_split($split, $str);
192             $d = stripslashes($d[0]);
193         } else {
194             $str = explode($d, $str);
195         }
196
197         $i = 0;
198         $term = array();
199
200         foreach ($str as $key => $val) {
201             if (empty($term[$i])) {
202                 $term[$i] = trim($val);
203
204                 $s1 = substr_count($term[$i], $e1);
205                 $s2 = substr_count($term[$i], $e2);
206
207                 if (strpos($term[$i], '(') !== false) {
208                     if ($s1 == $s2) {
209                         $i++;
210                     }
211                 } else {
212                     if ( ! (substr_count($term[$i], "'") & 1) &&
213                          ! (substr_count($term[$i], "\"") & 1)) {
214                         $i++;
215                     }
216                 }
217             } else {
218                 $term[$i] .= $d . trim($val);
219                 $c1 = substr_count($term[$i], $e1);
220                 $c2 = substr_count($term[$i], $e2);
221
222                 if (strpos($term[$i], '(') !== false) {
223                     if ($c1 == $c2) {
224                         $i++;
225                     }
226                 } else {
227                     if ( ! (substr_count($term[$i], "'") & 1) &&
228                          ! (substr_count($term[$i], "\"") & 1)) {
229                         $i++;
230                     }
231                 }
232             }
233         }
234         return $term;
235     }
236
237     /**
238      * clauseExplode
239      *
240      * explodes a string into array using custom brackets and
241      * quote delimeters
242      *
243      *
244      * example:
245      *
246      * parameters:
247      *      $str = "(age < 20 AND age > 18) AND name LIKE 'John Doe'"
248      *      $d   = ' '
249      *      $e1  = '('
250      *      $e2  = ')'
251      *
252      * would return an array:
253      *      array('(age < 20 AND age > 18)',
254      *            'name',
255      *            'LIKE',
256      *            'John Doe')
257      *
258      * @param string $str
259      * @param string $d         the delimeter which explodes the string
260      * @param string $e1        the first bracket, usually '('
261      * @param string $e2        the second bracket, usually ')'
262      *
263      * @return array
264      */
265     public static function clauseExplode($str, array $d, $e1 = '(', $e2 = ')')
266     {
267         if (is_array($d)) {
268             $d = array_map('preg_quote', $d);
269
270             if (in_array(' ', $d)) {
271                 $d[] = '\s';
272             }
273
274             $split = '§(' . implode('|', $d) . ')§';
275
276             $str = preg_split($split, $str, -1, PREG_SPLIT_DELIM_CAPTURE);
277         }
278
279         $i = 0;
280         $term = array();
281
282         foreach ($str as $key => $val) {
283             if ($key & 1) {
284                 if (isset($term[($i - 1)]) && ! is_array($term[($i - 1)])) {
285                     $term[($i - 1)] = array($term[($i - 1)], $val);
286                 }
287                 continue;
288             }
289             if (empty($term[$i])) {
290                 $term[$i] = $val;
291             } else {
292                 $term[$i] .= $str[($key - 1)] . $val;
293             }
294
295             $c1 = substr_count($term[$i], $e1);
296             $c2 = substr_count($term[$i], $e2);
297
298             if (strpos($term[$i], '(') !== false) {
299                 if ($c1 == $c2) {
300                     $i++;
301                 }
302             } else {
303                 if ( ! (substr_count($term[$i], "'") & 1) &&
304                      ! (substr_count($term[$i], "\"") & 1)) {
305                     $i++;
306                 }
307             }
308         }
309         $term[$i - 1] = array($term[$i - 1], '');
310
311         return $term;
312     }
313 }