PageRenderTime 26ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/phpmyfaq/inc/String/Mbstring.php

http://github.com/thorsten/phpMyFAQ
PHP | 292 lines | 93 code | 31 blank | 168 comment | 7 complexity | e40ad98e217e294e652e837931d33a87 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, LGPL-2.1, LGPL-3.0
  1. <?php
  2. /**
  3. * The string wrapper class using mbstring extension.
  4. *
  5. * PHP Version 5.3
  6. *
  7. * This Source Code Form is subject to the terms of the Mozilla Public License,
  8. * v. 2.0. If a copy of the MPL was not distributed with this file, You can
  9. * obtain one at http://mozilla.org/MPL/2.0/.
  10. *
  11. * @category phpMyFAQ
  12. * @package String
  13. * @author Anatoliy Belsky <ab@php.net>
  14. * @copyright 2009-2012 phpMyFAQ Team
  15. * @license http://www.mozilla.org/MPL/2.0/ Mozilla Public License Version 2.0
  16. * @link http://www.phpmyfaq.de
  17. * @since 2009-04-06
  18. */
  19. if (!defined('IS_VALID_PHPMYFAQ')) {
  20. exit();
  21. }
  22. /**
  23. * PMF_String_Mbstring
  24. *
  25. * @category phpMyFAQ
  26. * @package String
  27. * @author Anatoliy Belsky <ab@php.net>
  28. * @copyright 2009-2012 phpMyFAQ Team
  29. * @license http://www.mozilla.org/MPL/2.0/ Mozilla Public License Version 2.0
  30. * @link http://www.phpmyfaq.de
  31. * @since 2009-04-06
  32. */
  33. class PMF_String_Mbstring extends PMF_String_Abstract
  34. {
  35. /**
  36. * Instance
  37. *
  38. * @var PMF_String_Mbstring
  39. */
  40. private static $instance;
  41. /**
  42. *
  43. * Constructor
  44. *
  45. * @return PMF_String_Mbstring
  46. */
  47. private final function __construct()
  48. {
  49. }
  50. /**
  51. * Create and return an instance
  52. *
  53. * @param string $language
  54. *
  55. * @return PMF_String_Mbstring
  56. */
  57. public static function getInstance($language = 'en')
  58. {
  59. if (!self::$instance) {
  60. self::$instance = new self;
  61. self::$instance->encoding = self::DEFAULT_ENCODING;
  62. self::$instance->language = PMF_Language::isASupportedLanguage($language) ? $language : self::DEFAULT_LANGUAGE;
  63. mb_regex_encoding(self::$instance->encoding);
  64. }
  65. return self::$instance;
  66. }
  67. /**
  68. * Get string character count
  69. *
  70. * @param string $str String
  71. *
  72. * @return int
  73. */
  74. public function strlen($str)
  75. {
  76. return mb_strlen($str, $this->encoding);
  77. }
  78. /**
  79. * Get a part of string
  80. *
  81. * @param string $str String
  82. * @param int $start Start
  83. * @param int $length Length
  84. *
  85. * @return string
  86. */
  87. public function substr($str, $start, $length = null)
  88. {
  89. $length = null == $length ? mb_strlen($str) : $length;
  90. return mb_substr($str, $start, $length, $this->encoding);
  91. }
  92. /**
  93. * Get position of the first occurence of a string
  94. *
  95. * @param string $haystack Haystack
  96. * @param string $needle Needle
  97. * @param string $offset Offset
  98. *
  99. * @return int
  100. */
  101. public function strpos($haystack, $needle, $offset = 0)
  102. {
  103. return mb_strpos($haystack, $needle, $offset, $this->encoding);
  104. }
  105. /**
  106. * Make a string lower case
  107. *
  108. * @param string $str String
  109. *
  110. * @return string
  111. */
  112. public function strtolower($str)
  113. {
  114. return mb_strtolower($str, $this->encoding);
  115. }
  116. /**
  117. * Make a string upper case
  118. *
  119. * @param string $str String
  120. *
  121. * @return string
  122. */
  123. public function strtoupper($str)
  124. {
  125. return mb_strtoupper($str, $this->encoding);
  126. }
  127. /**
  128. * Get first occurence of a string within another
  129. *
  130. * @param string $haystack Haystack
  131. * @param string $needle Needle
  132. * @param boolean $part Part
  133. *
  134. * @return string|false
  135. */
  136. public function strstr($haystack, $needle, $part = false)
  137. {
  138. return mb_strstr($haystack, $needle, $part, $this->encoding);
  139. }
  140. /**
  141. * Get last occurence of a string within another
  142. * @param string $haystack
  143. * @param string $needle
  144. *
  145. * @return string
  146. */
  147. public function strrchr($haystack, $needle)
  148. {
  149. return mb_strrchr($haystack, $needle, false, $this->encoding);
  150. }
  151. /**
  152. *
  153. * Count substring occurences
  154. * @param string $haystack
  155. * @param string $needle
  156. *
  157. * @return int
  158. */
  159. public function substr_count($haystack, $needle)
  160. {
  161. return mb_substr_count($haystack, $needle, $this->encoding);
  162. }
  163. /**
  164. *
  165. * Match a regexp
  166. * @param string $pattern
  167. * @param string $subject
  168. * @param array &$matches
  169. * @param int $flags
  170. * @param int $offset
  171. *
  172. * @return int
  173. */
  174. public function preg_match($pattern, $subject, &$matches = null, $flags = 0, $offset = 0)
  175. {
  176. return preg_match(self::appendU($pattern), $subject, $matches, $flags, $offset);
  177. }
  178. /**
  179. *
  180. * Match a regexp globally
  181. * @param string $pattern
  182. * @param string $subject
  183. * @param array &$matches
  184. * @param int $flags
  185. * @param int $offset
  186. *
  187. * @return int
  188. */
  189. public function preg_match_all($pattern, $subject, &$matches, $flags = 0, $offset = 0)
  190. {
  191. return preg_match_all(self::appendU($pattern), $subject, $matches, $flags, $offset);
  192. }
  193. /**
  194. * Split string by a regexp
  195. * @param string $pattern
  196. * @param string $subject
  197. * @param int $limit
  198. * @param int $flags
  199. *
  200. * @return array
  201. */
  202. public function preg_split($pattern, $subject, $limit = -1, $flags = 0)
  203. {
  204. return preg_split(self::appendU($pattern), $subject, $limit, $flags);
  205. }
  206. /**
  207. * Search and replace by a regexp using a callback
  208. * @param string|array $pattern
  209. * @param function $callback
  210. * @param string|array $subject
  211. * @param int $limit
  212. * @param int &$count
  213. *
  214. * @return array|string
  215. */
  216. public function preg_replace_callback($pattern, $callback, $subject, $limit= -1, &$count = 0)
  217. {
  218. if(is_array($pattern)) {
  219. foreach($pattern as &$p) {
  220. $p = self::appendU($p);
  221. }
  222. } else {
  223. $pattern = self::appendU($pattern);
  224. }
  225. return preg_replace_callback($pattern, $callback, $subject, $limit, $count);
  226. }
  227. /**
  228. * Search and replace by a regexp
  229. * @param string|array $pattern
  230. * @param string|array $replacement
  231. * @param string|array $subject
  232. * @param int $limit
  233. * @param int &$count
  234. *
  235. * @return array|string|null
  236. */
  237. public function preg_replace($pattern, $replacement, $subject, $limit= -1, &$count = 0)
  238. {
  239. if(is_array($pattern)) {
  240. foreach($pattern as &$p) {
  241. $p = self::appendU($p);
  242. }
  243. } else {
  244. $pattern = self::appendU($pattern);
  245. }
  246. return preg_replace($pattern, $replacement, $subject, $limit, $count);
  247. }
  248. /**
  249. * Append an u to the string. The string is supposed
  250. * to be a regex prepared to use with a preg_* function
  251. *
  252. * @param string $str
  253. *
  254. * @return string
  255. */
  256. private static function appendU($str)
  257. {
  258. $str = (string) $str;
  259. return self::isUTF8($str) ? $str . 'u' : $str;
  260. }
  261. }