X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FUtil%2FStrings.php;h=3870074e1a7be84cfc3e6b1f4f17ab37fb4ee202;hb=39724d5079a51e1d4aebda01d6bd497014f329e8;hp=f91a78d66c802dc3ef0fcb9dad5a92f53382bb44;hpb=440da8a9f49f2a2d774cccbf0ab7bb2faba2c121;p=friendica.git diff --git a/src/Util/Strings.php b/src/Util/Strings.php index f91a78d66c..3870074e1a 100644 --- a/src/Util/Strings.php +++ b/src/Util/Strings.php @@ -1,7 +1,22 @@ . + * */ namespace Friendica\Util; @@ -10,12 +25,12 @@ use Friendica\Content\ContactSelector; use Friendica\Core\Logger; /** - * @brief This class handles string functions + * This class handles string functions */ class Strings { /** - * @brief Generates a pseudo-random string of hexadecimal characters + * Generates a pseudo-random string of hexadecimal characters * * @param int $size * @return string @@ -45,22 +60,7 @@ class Strings } /** - * @brief 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); - } - - /** - * @brief Use this on "body" or "content" input where angle chars shouldn't be removed, + * Use this on "body" or "content" input where angle chars shouldn't be removed, * and allow them to be safely displayed. * @param string $string * @@ -72,7 +72,7 @@ class Strings } /** - * @brief Generate a string that's random, but usually pronounceable. Used to generate initial passwords + * Generate a string that's random, but usually pronounceable. Used to generate initial passwords * * @param int $len length * @@ -179,7 +179,7 @@ class Strings } /** - * @brief Remove indentation from a text + * Remove indentation from a text * * @param string $text String to be transformed. * @param string $chr Optional. Indentation tag. Default tab (\t). @@ -209,7 +209,7 @@ class Strings } /** - * @brief Get byte size returned in a Data Measurement (KB, MB, GB) + * Get byte size returned in a Data Measurement (KB, MB, GB) * * @param int $bytes The number of bytes to be measured * @param int $precision Optional. Default 2. @@ -228,7 +228,7 @@ class Strings } /** - * @brief Protect percent characters in sprintf calls + * Protect percent characters in sprintf calls * * @param string $s String to transform. * @@ -240,7 +240,7 @@ class Strings } /** - * @brief Base64 Encode URL and translate +/ to -_ Optionally strip padding. + * Base64 Encode URL and translate +/ to -_ Optionally strip padding. * * @param string $s URL to encode * @param boolean $strip_padding Optional. Default false @@ -259,7 +259,7 @@ class Strings } /** - * @brief Decode Base64 Encoded URL and translate -_ to +/ + * Decode Base64 Encoded URL and translate -_ to +/ * @param string $s URL to decode * * @return string Decoded URL @@ -268,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; } @@ -292,7 +292,7 @@ class Strings } /** - * @brief Normalize url + * Normalize url * * @param string $url URL to be normalized. * @@ -305,7 +305,7 @@ class Strings } /** - * @brief Normalize OpenID identity + * Normalize OpenID identity * * @param string $s OpenID Identity * @@ -317,7 +317,7 @@ class Strings } /** - * @brief Compare two URLs to see if they are the same, but ignore + * Compare two URLs to see if they are the same, but ignore * slight but hopefully insignificant differences such as if one * is https and the other isn't, or if one is www.something and * the other isn't - and also ignore case differences. @@ -354,13 +354,43 @@ class Strings * @param array $chars * @return bool */ - public static function startsWith($string, array $chars) + public static function startsWithChars($string, array $chars) { $return = in_array(substr(trim($string), 0, 1), $chars); return $return; } + /** + * 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 + */ + public static function startsWith(string $string, string $start) + { + $return = substr_compare($string, $start, 0, strlen($start)) === 0; + + 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 * @@ -405,4 +435,90 @@ class Strings return $pathItem; } + + /** + * Multi-byte safe implementation of substr_replace where $start and $length are character offset and count rather + * than byte offset and counts. + * + * Depends on mbstring, use default encoding. + * + * @param string $string + * @param string $replacement + * @param int $start + * @param int|null $length + * @return string + * @see substr_replace() + */ + public static function substringReplace(string $string, string $replacement, int $start, int $length = null) + { + $string_length = mb_strlen($string); + + $length = $length ?? $string_length; + + if ($start < 0) { + $start = max(0, $string_length + $start); + } else if ($start > $string_length) { + $start = $string_length; + } + + if ($length < 0) { + $length = max(0, $string_length - $start + $length); + } else if ($length > $string_length) { + $length = $string_length; + } + + if (($start + $length) > $string_length) { + $length = $string_length - $start; + } + + 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; + } }