source: trunk/workflow/inc/local/classes/class.wf_regex.php @ 5980

Revision 5980, 12.9 KB checked in by asaikawa, 12 years ago (diff)

Ticket #2398 - Corrigido no Workflow o problema com a expressao regular de data, cujas barras devem ser escapadas

  • Property svn:executable set to *
Line 
1<?php
2/**
3 * Classe repositorio de padroes de validacao de expressoes regulares
4 *
5 * @author Carlos Eduardo Nogueira Goncalves
6 * @version 1.2
7 * @todo Incluir mais validacoes pre-definidas.
8 * @license http://www.gnu.org/copyleft/gpl.html GPL
9 * @package Workflow
10 * @subpackage local
11 */
12class wf_regex
13{
14        /* INiCIO DECLARAcaO DE CONSTANTES */
15
16        /**
17         * @var string $INDEX_BY_STRING Indexacao do array de resultados por string
18         * @access private
19         */
20        var $INDEX_BY_STRING = "string";
21
22        /**
23         * @var string $INDEX_BY_INT Indexacao do array de resultados por inteiro
24         * @access private
25         */
26        var $INDEX_BY_INT = "int";
27
28        /* FORMATOS ESPECiFICOS */
29
30        /**
31         * @var string $CEP Padrao de validacao de CEPs
32         */
33        var $CEP = '^[[:digit:]]{5}-[[:digit:]]{3}$';
34
35        /**
36         * @attention Formato xxx.xxx.xxx-xx
37         * @var string $CPF Padrao de validacao de CPFs (Formato xxx.xxx.xxx-xx)
38         */
39        var $CPF = '^([[:digit:]]{3}\.){2}[[:digit:]]{3}-[[:digit:]]{2}$';
40
41        /**
42         * @var string $ADDR_MAC Padrao de validacao de enderecos MAC
43         */
44        var $ADDR_MAC = '^(([0-9a-f]{2}):){5}([0-9a-f]{2})$';
45
46        /**
47         * @var string $DATE Padrao de validacao de datas (Formato dd/mm/aaaa)
48         */
49        var $DATE = '^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[0-2])\/[12][0-9]{3}$';
50
51        /**
52         * @var string $TIME Padrao de validacao de horas (Formato hh:mm)
53         */
54        var $TIME = '^([01][[:digit:]]|2[0-3]):[0-5][[:digit:]]$';
55
56        /**
57         * @var string $TIME_GLOBAL Padrão de horas (Formato D:mm, onde D = N dígitos sendo N >=1)
58         */
59        var $TIME_GLOBAL = '^([[:digit:]])+:[0-5][[:digit:]]$';
60
61        /**
62         * @var string $TEL_DDI Padrao de validacao de numeros de telefones com DDI (Formato +00 (00) 0000-0000, podendo ter parênteses e/ou hífen, ou não)
63         */
64        var $TEL_DDI = '^([+][[:digit:]]{2})?([ (]{1,2}[[:digit:]]{2}[ )]{1,2})?[[:digit:]]{4}[ -]?[[:digit:]]{4}$';
65
66        /**
67         * @var string $TEL_DDD Padrao de validacao de numeros de telefones com DDD (Formato (00) 0000-0000)
68         */
69        var $TEL_DDD = '^\([[:digit:]]{2}\)\s[[:digit:]]{4}-[[:digit:]]{4}$';
70
71        /**
72         * @var string $TEL Padrao de validacao de numeros de telefones (Formato 0000-0000)
73         */
74        var $TEL = '^([[:digit:]]{4})-([[:digit:]]{4})$';
75
76        /**
77         * @var string $ADDR_IP Padrao de validacao de enderecos IP
78         */
79        var $ADDR_IP = '^(([1]?[0-9]{1,2}|2([0-4][0-9]|5[0-5]))\.){3}([1]?[0-9]{1,2}|2([0-4][0-9]|5[0-5]))$';
80
81        /**
82         * @var string $ADDR_EMAIL Padrao de validacao de enderecos de correio eletronico (Formato mail@mail.mail[.mail])
83         */
84        var $ADDR_EMAIL = '^([0-9a-zA-Z]+)([._-]?[0-9a-zA-Z]+)*[@]([0-9a-zA-Z]+)([._-]?[0-9a-zA-Z]+)*[.][a-zA-Z][a-zA-Z]+$';
85//      var $ADDR_EMAIL = '^[A-Za-z0-9_.-]+@[[:lower:]]+\.[[:lower:]]+(\.[[:lower:]]+){0,2}$';
86//      var $ADDR_EMAIL = '^((\w)|([[:punct:]]))+@[[:lower:]]+\.[[:lower:]]+(\.[[:lower:]]+){0,2}$';
87
88        /**
89         * @var string $RG Padrao de validacao de documentos de RG
90         */
91        var $RG = '^[[:digit:]]{1,2}(\.[[:digit:]]{3}){2}-(([[:digit:]])|([xX]))$';
92
93        /**
94         * @var string $CURRENCY Padrao de validacao de unidades monetarias
95         */
96        var $CURRENCY = '^[R]?[$](([[:digit:]]){1,3}\.)*(([[:digit:]]){1,3}\,)(([[:digit:]]){2})$';
97
98        /* PADROES AUXILIARES DE POSICIONAMENTO */
99
100        /**
101         * @var string $_BEGIN Caracter de inicio de textos alternativo
102         */
103        var $_BEGIN = '\A';
104
105        /**
106         * @var string $BEGIN Caracter de inicio de textos
107         */
108        var $BEGIN = '^';
109
110        /**
111         * @var string $_END Caracter de fim de textos alternativo
112         */
113        var $_END = '\Z';
114
115        /**
116         * @var string $END Caracter de fim de textos
117         */
118        var $END = '$';
119
120        /**
121         * @var string $WORD_BEGIN Inicio de palavras. Ex: dia\b = dia, bom-dia.
122         */
123        var $WORD_BEGIN = '\h';
124
125        /**
126         * @var string $WORD_END Nao aceita caracteres no inicio de palavras. Ex: dia\b = lombardia, covardia
127         */
128        var $WORD_END = '\H';
129
130        /**
131         * @var string $BORDER Extremidade (limite) de palavras. Ex: dia\b = dia, bom-dia. \bdia = dia, diagnostico
132         */
133        var $BORDER = '\b';
134
135        /**
136         * @var string $NON_BORDER Dentro das palavras. Ex: min\B = domingo, administrador
137         */
138        var $NON_BORDER = '\B';
139
140        /* PADRoES AUXILIARES DE TIPO */
141
142        /**
143         * @var string $DIGIT Digitos decimais
144         */
145        var $DIGIT = '\d';
146
147        /**
148         * @var string $NON_DIGIT Nao aceita digitos decimais
149         */
150        var $NON_DIGIT = '\D';
151
152        /**
153         * @var string $XDIGIT Digitos hexadecimais
154         */
155        var $XDIGIT = '[[:xdigit:]]';
156
157        /**
158         * @var string $ALPHA_NUM Letras e numeros
159         */
160        var $ALPHA_NUM = '\w';
161
162        /**
163         * @var string $NON_ALPHA_NUM Nao aceita letras e numeros
164         */
165        var $NON_ALPHA_NUM = '\W';
166
167        /**
168         * @var string $PUNCT Sinais de pontuacao
169         */
170        var $PUNCT = '[[:punct:]]';
171
172        /* PADRoES AUXILIARES DE CONTROLE DE QUANTIDADE */
173
174        /**
175         * @var string $ZERO_OR_ONE Nenhum ou um caracter
176         */
177        var $ZERO_OR_ONE = '?';
178
179        /**
180         * @var string $ZERO_OR_INFINITE Nenhum ou infinitos caracteres
181         */
182        var $ZERO_OR_INFINITE = '*';
183
184        /**
185         * @var string $ONE_OR_INFINITE Um ou infinitos caracteres
186         */
187        var $ONE_OR_INFINITE = '+';
188
189        /* PADRoES AUXILIARES DE CAIXA DE TEXTO */
190
191        /**
192         * @var string $UPPER Letras maiusculas
193         */
194        var $UPPER = '[:upper:]';
195
196        /**
197         * @var string $NON_UPPER Nao aceita letras maiusculas
198         */
199        var $NON_UPPER = '\U';
200
201        /**
202         * @var string $LOWER Letras minusculas
203         */
204        var $LOWER = '[:lower:]';
205
206        /**
207         * @var string $NON_LOWER Nao aceita letras minusculas
208         */
209        var $NON_LOWER = '\L';
210
211        /* META-CARACTERES */
212
213        /**
214         * @var string $BEGIN_ESCAPE Caracter de inicio de trecho com valor literal
215         */
216        var $BEGIN_ESCAPE = '\Q';
217
218        /**
219         * @var string $END_ESCAPE Caracter de encerramento de trecho com valor literal
220         */
221        var $END_ESCAPE = '\E';
222
223        /**
224         * @var string $BEGIN_GROUP Caracter de inicio de trecho agrupado
225         */
226        var $BEGIN_GROUP = '(';
227
228        /**
229         * @var string $END_GROUP Caracter de encerramento de trecho agrupado
230         */
231        var $END_GROUP = ')';
232
233        /**
234         * @var string $OR Caracter logico OU (mais util em grupos)
235         */
236        var $OR = '|';
237
238        /**
239         * @var string $V_TAB Caracter de tabulacao vertical
240         */
241        var $V_TAB = '\v';
242
243        /**
244         * @var string $TAB Caracter de tabulacao horizontal
245         */
246        var $TAB = '\t';
247
248        /**
249         * @var string $NEW_LINE Caracter de linha nova
250         */
251        var $NEW_LINE = '\n';
252
253        /**
254         * @var string $CARRIAGE_RETURN Caracter de retorno de carro
255         */
256        var $CARRIAGE_RETURN = '\r';
257
258        /**
259         * @var string $BLANK Caracteres de espaco e tabulacao
260         */
261        var $BLANK = '[:blank:]';
262
263        /* FIM DECLARAcaO DE CONSTANTES */
264
265
266        /* INiCIO DECLARAcaO DE ATRIBUTOS */
267
268        /**
269     * @var array $validResults Array indexado pelos valores de entrada, com os respectivos resultados de validacao
270         */
271        var $validResults;
272
273        /**
274         * @var boolean $indexBy Modo de indexacao dos resultados da validacao de multiplos valores
275         */
276        var $indexBy = INDEX_BY_STRING;
277
278        /**
279         * @var string $custom Expressao regular personalizada
280         */
281        var $custom;
282
283        /* FIM DECLARAcaO DE ATRIBUTOS */
284
285
286        /* INiCIO DECLARAcaO DE MeTODOS */
287
288        /**
289         * Construtor.
290         *
291         * @param string $indexBy Modo de indexacao dos resultados da validacao de multiplos valores.
292         * @return object
293         */
294        function wf_regex( $indexBy = "string" )
295        {
296                $this->indexBy = $indexBy;
297        }
298
299        /**
300         * Metodo para construir expressao regular personalizada.
301         *
302         * @param string $chars Caracteres a serem adicionados.
303         * @return void
304         */
305        function append ( $chars )
306        {
307                $this->custom .= $chars;
308        }
309
310        /**
311         * Metodo para adicionar um caracter literal
312         *
313         * @param string $char Caracter.
314         * @return void
315         */
316        function appendEscaped ( $char )
317        {
318                $this->custom .= '\Q' . $char . '\E';
319        }
320
321        /**
322         * Metodo para retorna um caracter literal
323         *
324         * @param string $char Caracter
325         * @return string
326         */
327        function getEscaped ( $char )
328        {
329                return('\Q' . $char . '\E');
330        }
331
332        /**
333         * Metodo para adicionar um grupo de caracteres
334         *
335         * @param string $chars Caracteres
336         * @return void
337         */
338        function appendGroup ( $chars )
339        {
340                $this->custom .= '(' . $chars . ')';
341        }
342
343        /**
344         * Metodo para retornar um grupo de caracteres
345         *
346         * @param string $chars Caracteres
347         * @return string
348         */
349        function getGroup ( $chars )
350        {
351                return('(' . $chars . ')');
352        }
353
354        /**
355         * Metodo para adicionar uma lista a expressao regular personalizada
356         *
357         * @param string $chars Caracteres permitidos pela lista
358         * @return void
359         */
360        function appendList ( $chars )
361        {
362                $this->custom .= '[' . $chars . ']';
363        }
364
365        /**
366         * Metodo para retornar uma lista
367         *
368         * @param string $chars Caracteres permitidos pela lista
369         * @return string
370         */
371        function getList ( $chars )
372        {
373                return('[' . $chars . ']');
374        }
375
376        /**
377         * Metodo para adicionar uma lista negada a expressao regular personalizada
378         *
379         * @param string $chars Caracteres proibidos pela lista negada
380         * @return void
381         */
382        function appendDeniedList ( $chars )
383        {
384                $this->custom .= '[^' . $chars . ']';
385        }
386
387        /**
388         * Metodo para retornar uma lista negada
389         *
390         * @param string $chars Caracteres proibidos pela lista negada
391         * @return string
392         */
393        function getDeniedList ( $chars )
394        {
395                return('[^' . $chars . ']');
396        }
397
398        /**
399         * Metodo para adicionar uma intervalo de caracteres em uma lista
400         *
401         * @param string $ini Caracter inicial do intervalo
402         * @param string $end Caracter final do intervalo
403         * @return void
404         */
405        function appendIntervalList ( $ini, $end )
406        {
407                $this->custom .= '[' . $ini . '-' . $end . ']';
408        }
409
410        /**
411         * Metodo para retornar uma intervalo de caracteres em uma lista
412         *
413         * @param string $ini Caracter inicial do intervalo
414         * @param string $end Caracter final do intervalo
415         * @return string
416         */
417        function getIntervalList ( $ini, $end )
418        {
419                return('[' . $ini . '-' . $end . ']');
420        }
421
422        /**
423         * Metodo para adicionar uma intervalo de caracteres em uma lista negada
424         *
425         * @param string $ini Caracter inicial do intervalo
426         * @param string $end Caracter final do intervalo
427         * @return void
428         */
429        function appendIntervalDeniedList ( $ini, $end )
430        {
431                $this->custom .= '[^' . $ini . '-' . $end . ']';
432        }
433
434        /**
435         * Metodo para retornar uma intervalo de caracteres em uma lista negada
436         *
437         * @param string $ini Caracter inicial do intervalo
438         * @param string $end Caracter final do intervalo
439         * @return string
440         */
441        function getIntervalDeniedList ( $ini, $end )
442        {
443                return('[^' . $ini . '-' . $end . ']');
444        }
445
446        /**
447         * Metodo para adicionar um controle de quantidade de caracteres a expressao regular personalizada
448         *
449         * @param int $count Quantidade permitida
450         * @return void
451         */
452        function appendCount ( $count )
453        {
454                $this->custom .= '{' . $count . '}';
455        }
456
457        /**
458         * Metodo para retornar um controle de quantidade de caracteres
459         *
460         * @param int $count Quantidade permitida
461         * @return string
462         */
463        function getCount ( $count )
464        {
465                return('{' . $count . '}');
466        }
467
468        /**
469         * Metodo para adicionar um controle de quantidade de caracteres a expressao regular personalizada
470         *
471         * @param int $min Quantidade minima
472         * @param int $max Quantidade maxima (vazio para infinito)
473         * @return void
474         */
475        function appendCountInterval ( $min, $max )
476        {
477                $this->custom .= '{' . $min . ',' . $max . '}';
478        }
479
480        /**
481         * Metodo para retornar um controle de quantidade de caracteres
482         *
483         * @param int $min Quantidade minima
484         * @param int $max Quantidade maxima (vazio para infinito)
485         * @return string
486         */
487        function getCountInterval ( $min, $max )
488        {
489                return('{' . $min . ',' . $max . '}');
490        }
491
492        /**
493         * Metodo para limpar expressao regular personalizada
494         *
495         * @return void
496         */
497        function clear ( )
498        {
499                $this->custom = "";
500        }
501
502        /**
503         * Metodo para alterar a forma de indexacao dos resultados da validacao de multiplos valores
504         *
505         * @param string $mode Modo de indexacao. Deve ser wf_regex->INDEX_BY_STRING ou wf_regex->INDEX_BY_INT
506         * @return void
507         */
508        function setIndexMode ( $mode )
509        {
510                if ( ( $mode == $this->INDEX_BY_STRING ) || ( $mode == $this->INDEX_BY_INT ) )
511                        $this->indexBy = $mode;
512        }
513
514        /**
515         * Valida valor de entrada com base em padroes de expressoes regulares
516         *
517         * @param string $pattern Padrao de expressao regular
518         * @param string $input Valor de entrada a ser validado
519         * @param boolean $caseSensitive Considerar caixa do valor de entrada
520         * @return boolean Resultado da validacao
521         */
522        function validate( $pattern, $input, $caseSensitive = TRUE )
523        {
524                if ( $caseSensitive )
525                        return( preg_match("/$pattern/", (string) $input ) );
526                else
527                        return( preg_match("/$pattern/i", (string) $input ) );
528        }
529
530        /**
531         * Valida valores de entrada em forma de array com base em padroes de expressoes regulares
532         *
533         * @param string $pattern Padrao de expressao regular
534         * @param array $input Valor de entrada a ser validado
535         * @param boolean $caseSensitive Considerar caixa do valor de entrada
536         * @return boolean Resultado da validacao
537         */
538        function validateEntries( $pattern, $input, $caseSensitive = TRUE )
539        {
540                //caso o valor de entrada nao seja um array chama a funcao de validacao de valores individuais
541                if (! is_array( $input ) )
542                        return( $this->validate( $pattern, $input, $caseSensitive ) );
543
544                //faz a validacao de cada elemento do array e armazena o resultado no atributo da classe
545                foreach ( $input as $item )
546                {
547                        if ($this->indexBy == $this->INDEX_BY_STRING)
548                                $this->validResults[ (string) $item ] = $this->validate( $pattern, $item, $caseSensitive );
549                        else
550                                $this->validResults[ ] = $this->validate( $pattern, $item, $caseSensitive );
551                }
552        }
553
554        /* FIM DECLARAcaO DE MeTODOS */
555}
556?>
Note: See TracBrowser for help on using the repository browser.