]> git.mxchange.org Git - friendica.git/blobdiff - src/Util/Strings.php
Add the mentions
[friendica.git] / src / Util / Strings.php
index 04d676ef57364ac87ad5c37cb3aff83a53afd672..3870074e1a7be84cfc3e6b1f4f17ab37fb4ee202 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * @copyright Copyright (C) 2020, Friendica
+ * @copyright Copyright (C) 2010-2022, the Friendica project
  *
  * @license GNU AGPL version 3 or any later version
  *
@@ -59,21 +59,6 @@ class Strings
                return !empty($hexCode) ? @preg_match("/^[a-f0-9]{2,}$/i", $hexCode) && !(strlen($hexCode) & 1) : false;
        }
 
-       /**
-        * This is our primary input filter.
-        *
-        * Use this on any text input where angle chars are not valid or permitted
-        * They will be replaced with safer brackets. This may be filtered further
-        * if these are not allowed either.
-        *
-        * @param string $string Input string
-        * @return string Filtered string
-        */
-       public static function escapeTags($string)
-       {
-               return str_replace(["<", ">"], ['[', ']'], $string);
-       }
-
        /**
         * Use this on "body" or "content" input where angle chars shouldn't be removed,
         * and allow them to be safely displayed.
@@ -283,7 +268,7 @@ class Strings
        public static function base64UrlDecode($s)
        {
                if (is_array($s)) {
-                       Logger::log('base64url_decode: illegal input: ' . print_r(debug_backtrace(), true));
+                       Logger::notice('base64url_decode: illegal input: ', ['backtrace' => debug_backtrace()]);
                        return $s;
                }
 
@@ -379,6 +364,7 @@ class Strings
        /**
         * Check if the first string starts with the second
         *
+        * @see http://maettig.com/code/php/php-performance-benchmarks.php#startswith
         * @param string $string
         * @param string $start
         * @return bool
@@ -390,6 +376,21 @@ class Strings
                return $return;
        }
 
+       /**
+        * Checks if the first string ends with the second
+        *
+        * @see http://maettig.com/code/php/php-performance-benchmarks.php#endswith
+        * @param string $string
+        * @param string $end
+        * @return bool
+        */
+       public static function endsWith(string $string, string $end)
+       {
+               $return = substr_compare($string, $end, -strlen($end)) === 0;
+
+               return $return;
+       }
+
        /**
         * Returns the regular expression string to match URLs in a given text
         *
@@ -472,4 +473,52 @@ class Strings
 
                return mb_substr($string, 0, $start) . $replacement . mb_substr($string, $start + $length, $string_length - $start - $length);
        }
+
+       /**
+        * Perform a custom function on a text after having escaped blocks matched by the provided regular expressions.
+        * Only full matches are used, capturing group are ignored.
+        *
+        * To change the provided text, the callback function needs to return it and this function will return the modified
+        * version as well after having restored the escaped blocks.
+        *
+        * @param string   $text
+        * @param string   $regex
+        * @param callable $callback
+        * @return string
+        * @throws \Exception
+        */
+       public static function performWithEscapedBlocks(string $text, string $regex, callable $callback)
+       {
+               // Enables nested use
+               $executionId = random_int(PHP_INT_MAX / 10, PHP_INT_MAX);
+
+               $blocks = [];
+
+               $text = preg_replace_callback($regex,
+                       function ($matches) use ($executionId, &$blocks) {
+                               $return = '«block-' . $executionId . '-' . count($blocks) . '»';
+
+                               $blocks[] = $matches[0];
+
+                               return $return;
+                       },
+                       $text
+               );
+
+               $text = $callback($text) ?? '';
+
+               // Restore code blocks
+               $text = preg_replace_callback('/«block-' . $executionId . '-([0-9]+)»/iU',
+                       function ($matches) use ($blocks) {
+                               $return = $matches[0];
+                               if (isset($blocks[intval($matches[1])])) {
+                                       $return = $blocks[$matches[1]];
+                               }
+                               return $return;
+                       },
+                       $text
+               );
+
+               return $text;
+       }
 }