/x2engine/protected/components/util/StringUtil.php

https://gitlab.com/e0/X2CRM · PHP · 127 lines · 61 code · 14 blank · 52 comment · 12 complexity · a259391a181c32b083a05c34d16780bf MD5 · raw file

  1. <?php
  2. /***********************************************************************************
  3. * X2CRM is a customer relationship management program developed by
  4. * X2Engine, Inc. Copyright (C) 2011-2016 X2Engine Inc.
  5. *
  6. * This program is free software; you can redistribute it and/or modify it under
  7. * the terms of the GNU Affero General Public License version 3 as published by the
  8. * Free Software Foundation with the addition of the following permission added
  9. * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
  10. * IN WHICH THE COPYRIGHT IS OWNED BY X2ENGINE, X2ENGINE DISCLAIMS THE WARRANTY
  11. * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
  12. *
  13. * This program is distributed in the hope that it will be useful, but WITHOUT
  14. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  15. * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
  16. * details.
  17. *
  18. * You should have received a copy of the GNU Affero General Public License along with
  19. * this program; if not, see http://www.gnu.org/licenses or write to the Free
  20. * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  21. * 02110-1301 USA.
  22. *
  23. * You can contact X2Engine, Inc. P.O. Box 66752, Scotts Valley,
  24. * California 95067, USA. on our website at www.x2crm.com, or at our
  25. * email address: contact@x2engine.com.
  26. *
  27. * The interactive user interfaces in modified source and object code versions
  28. * of this program must display Appropriate Legal Notices, as required under
  29. * Section 5 of the GNU Affero General Public License version 3.
  30. *
  31. * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
  32. * these Appropriate Legal Notices must retain the display of the "Powered by
  33. * X2Engine" logo. If the display of the logo is not reasonably feasible for
  34. * technical reasons, the Appropriate Legal Notices must display the words
  35. * "Powered by X2Engine".
  36. **********************************************************************************/
  37. class StringUtil {
  38. /**
  39. * Like preg_replace but with option to have exception thrown if error occurs
  40. */
  41. public static function pregReplace (
  42. $pattern, $replacement, $subject, $limit = null, &$count = null, $throws=true) {
  43. // precondition check
  44. assert (!($limit === null && $count !== null));
  45. if ($count !== null) {
  46. $retVal = preg_replace ($pattern, $replacement, $subject, $limit, $count);
  47. } elseif ($limit !== null) {
  48. $retVal = preg_replace ($pattern, $replacement, $subject, $limit);
  49. } else {
  50. $retVal = preg_replace ($pattern, $replacement, $subject);
  51. }
  52. if ($throws && $retVal === null) {
  53. throw new StringUtilException(
  54. Yii::t('app', 'preg_replace error: {error}',
  55. array(
  56. '{error}' => StringUtilException::getErrorMessage(preg_last_error())
  57. )), StringUtilException::PREG_REPLACE_ERROR);
  58. }
  59. return $retVal;
  60. }
  61. /**
  62. * Like preg_replace_callback but with option to have exception thrown if error occurs
  63. */
  64. public static function pregReplaceCallback (
  65. $pattern, $callback, $subject, $limit = null, &$count = null, $throws=true) {
  66. // precondition check
  67. assert (!($limit === null && $count !== null));
  68. if ($count !== null) {
  69. $retVal = preg_replace_callback ($pattern, $callback, $subject, $limit, $count);
  70. } elseif ($limit !== null) {
  71. $retVal = preg_replace_callback ($pattern, $callback, $subject, $limit);
  72. } else {
  73. $retVal = preg_replace_callback ($pattern, $callback, $subject);
  74. }
  75. if ($throws && $retVal === null) {
  76. throw new StringUtilException(
  77. Yii::t('app', 'preg_replace_callback error: {error}',
  78. array(
  79. '{error}' => StringUtilException::getErrorMessage(preg_last_error())
  80. )), StringUtilException::PREG_REPLACE_CALLBACK_ERROR);
  81. }
  82. return $retVal;
  83. }
  84. /**
  85. * Like json_decode, but returns $subject if decoding fails
  86. */
  87. public static function jsonDecode ($subject, $assoc=false, $depth=512) {
  88. $decoded = json_decode ($subject, $assoc, $depth);
  89. if ($decoded !== null) return $decoded;
  90. return $subject;
  91. }
  92. /**
  93. * @return bool true if string is json, false otherwise
  94. */
  95. public static function isJson ($string) {
  96. json_decode ($string);
  97. return (json_last_error() == JSON_ERROR_NONE);
  98. }
  99. }
  100. class StringUtilException extends Exception {
  101. const PREG_REPLACE_ERROR = 1;
  102. const PREG_REPLACE_CALLBACK_ERROR = 2;
  103. /**
  104. * Convert PCRE error constant into an error message
  105. */
  106. public static function getErrorMessage ($pcreConstant) {
  107. $definedConstants = get_defined_constants (true);
  108. $pcreConstantsByErrorCodes = array_flip ($definedConstants['pcre']);
  109. return isset ($pcreConstantsByErrorCodes[$pcreConstant]) ?
  110. $pcreConstantsByErrorCodes[$pcreConstant] : '';
  111. }
  112. }
  113. ?>