PageRenderTime 44ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/ xvweb/plugins/data/Bbcode/DataValidator.class.php

http://xvweb.googlecode.com/
PHP | 148 lines | 77 code | 22 blank | 49 comment | 26 complexity | e2faff05ff75c08d0f0d8c2f02a2214d MD5 | raw file
Possible License(s): GPL-2.0, GPL-3.0, LGPL-3.0
  1. <?php
  2. /**
  3. * Walidator dla parsera bbcode
  4. * @package Parser
  5. * @author Wookieb
  6. * @version 1.2
  7. */
  8. class DataValidator
  9. {
  10. /**
  11. * Jednostka u?yta w ostatniej operacji funkcji {@link parseNumber()}
  12. * @var string
  13. */
  14. public static $parseNumberDimension=false;
  15. /**
  16. * Sprawdza wartosc tekstowa.
  17. * Przepuszcza wszystkie wartosci, jezeli nie podano parametrow $values i $replace
  18. *
  19. * @param string $str ciag do sprawdzenia
  20. * @param array $values dopuszczalne wartosci wraz z mozliwosciami zamian
  21. * @param array $replace czy dopuszczac do zamiany ciagu
  22. * @return string
  23. */
  24. public static function checkStringValues($str, $values=null, $replace=null)
  25. {
  26. // jezeli dopuszczane s? wszystkie warto?ci to lepiej zabezpieczy? si? przez jakim? xss-em
  27. if($values === null) return htmlspecialchars($str);
  28. if(!is_array($values)) $values = array();
  29. if(in_array($str, $values)) return $str;
  30. elseif($replace && array_key_exists($str, $values)) return $values[$str];
  31. else
  32. {
  33. return false;
  34. }
  35. }
  36. /**
  37. * Sprawdza numer pod k?tem podanej jednostki i podanych do niej opcji
  38. * @param string $text tekst do sprawdzenia
  39. * @param array $dimensions tablica mo?liwych jednostek. Nazwy jednostek powinno by? kluczami owej tablicy natomiast warto??i, tablic?.
  40. * Oto mo?liwe warto?ci ustawie?:
  41. * <strong>min_value</strong> - warto?? minimalna
  42. * <strong>max_value</strong> - warto?? maksymalna
  43. * <strong>values</strong> - tablica dopuszczalnych warto?ci. Podanie tej tablicy spowoduje zignorowanie ustawie? min_value oraz max_values
  44. * <strong>round_places</strong> - liczba miejsc po przecinku do których zaokr?gli? liczb?
  45. * <strong>absolute</strong> - Czy liczba ma by? warto??i? bezwzgl?dn?
  46. *
  47. * @param string $defaultDimension domy?lna jednostka
  48. * @param bool $retDimension czy zwracana liczba ma zawiera? jednostk??
  49. * @return string|bool
  50. * @uses self::$parseNumberDimension nazwa jednostki uzytej podczas ostatniego sprawdzania numeru
  51. */
  52. public static function parseNumber($text, $dimensions, $defaultDimension=false, $retDimension=false)
  53. {
  54. $text=trim($text);
  55. // brak tekstu
  56. if(strlen($text)==0)
  57. {
  58. trigger_error('Empty string to check', E_USER_NOTICE);
  59. }
  60. //niepoprawny format
  61. if(!preg_match('/([0-9]+(?:\.[0-9]+)?)\s*([a-z]*)/i', $text, $matches)) return -1;
  62. $number=(float)$matches[1];
  63. $dimension=trim(strtolower($matches[2]));
  64. //have dimension
  65. if($dimension=='')
  66. {
  67. // nie ma domyslnego to pobiera pierwszy z brzegu
  68. if($defaultDimension==false) $dimension=reset(array_keys($dimensions));
  69. else $dimension=$defaultDimension;
  70. }
  71. self::$parseNumberDimension=$dimension;
  72. // nie ma jednostki badz nie ustawien jednostki to wywala numer
  73. if($dimension==false)return $number;
  74. if(!isset($dimensions[$dimension])) return $number;
  75. $options=$dimensions[$dimension];
  76. // zaokraglanie
  77. if(isset($options['round_places']) && is_numeric($options['round_places']) && $options['round_places']>=0 )
  78. {
  79. $roundPlaces=$options['round_places'];
  80. $number=round($number, $roundPlaces);
  81. }
  82. // wartosc bezwzgledna
  83. if(isset($options['absolute']) && $option['absolute'])
  84. {
  85. $number=abs($number);
  86. }
  87. if(isset($options['values']) && is_array($options['values']))
  88. {
  89. if(in_array($number, $options['values']))
  90. {
  91. return ($retDimension)?$number.$dimension:$number;
  92. }
  93. else
  94. {
  95. // nie jest w podanych wartosciach
  96. trigger_error('The number is not in valid array', E_USER_NOTICE);
  97. }
  98. }
  99. if(isset($options['min_value']) && is_numeric($options['min_value']))
  100. {
  101. if($number<$options['min_value'])
  102. {
  103. trigger_error('Out of range (minimal)', E_USER_NOTICE); // wartosc za mala
  104. }
  105. }
  106. if(isset($options['max_value']) && is_numeric($options['max_value']))
  107. {
  108. if($number>$options['max_value'])
  109. {
  110. trigger_error('Out of range (maximal)', E_USER_NOTICE); // wartosc za duza
  111. }
  112. }
  113. return ($retDimension)?$number.$dimension:$number;
  114. }
  115. /**
  116. * Sprawdza adres url i wycina z niego
  117. * @param string $text
  118. * @return string|bool false w przypadku nieprawidlowego urla
  119. */
  120. public static function checkUrl($text)
  121. {
  122. if(!preg_match('/((?:https?|ftp):\/\/[\w\d:#@%\/;$()*~_?\+\-=\.&!\'\[\]@,]+)/i', $text)) return false;
  123. $text=preg_replace('/(javascript:)/is', '', $text);
  124. return htmlspecialchars($text);
  125. }
  126. }