X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FUtil%2FStrings.php;h=84a8b6727a3d4d4383bf22a1c06d5b58d2682f24;hb=b5ad8c3e153976cf3e63753597377f09852d98d7;hp=f91a78d66c802dc3ef0fcb9dad5a92f53382bb44;hpb=fed486bfc50f9c78bf84cd57108b558c82b38af7;p=friendica.git diff --git a/src/Util/Strings.php b/src/Util/Strings.php index f91a78d66c..84a8b6727a 100644 --- a/src/Util/Strings.php +++ b/src/Util/Strings.php @@ -1,7 +1,22 @@ . + * */ namespace Friendica\Util; @@ -10,18 +25,19 @@ 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 + * @param int $size Size of string (default: 64) + * + * @return string Pseudo-random string * @throws \Exception */ - public static function getRandomHex($size = 64) + public static function getRandomHex(int $size = 64): string { $byte_size = ceil($size / 2); @@ -36,31 +52,15 @@ class Strings * Checks, if the given string is a valid hexadecimal code * * @param string $hexCode - * * @return bool */ - public static function isHex($hexCode) + public static function isHex(string $hexCode): bool { return !empty($hexCode) ? @preg_match("/^[a-f0-9]{2,}$/i", $hexCode) && !(strlen($hexCode) & 1) : false; } /** - * @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,13 +72,12 @@ 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 - * * @return string */ - public static function getRandomName($len) + public static function getRandomName(int $len): string { if ($len <= 0) { return ''; @@ -165,7 +164,7 @@ class Strings * @return string Formatted network name * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - public static function formatNetworkName($network, $url = '') + public static function formatNetworkName(string $network, string $url = ''): string { if ($network != '') { if ($url != '') { @@ -176,10 +175,12 @@ class Strings return $network_name; } + + return ''; } /** - * @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). @@ -187,7 +188,7 @@ class Strings * * @return string Transformed string. */ - public static function deindent($text, $chr = "[\t ]", $count = NULL) + public static function deindent(string $text, string $chr = "[\t ]", int $count = null): string { $lines = explode("\n", $text); @@ -209,14 +210,14 @@ 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. * * @return string Size with measured units. */ - public static function formatBytes($bytes, $precision = 2) + public static function formatBytes(int $bytes, int $precision = 2): string { $units = ['B', 'KB', 'MB', 'GB', 'TB']; $bytes = max($bytes, 0); @@ -228,26 +229,24 @@ class Strings } /** - * @brief Protect percent characters in sprintf calls + * Protect percent characters in sprintf calls * * @param string $s String to transform. - * * @return string Transformed string. */ - public static function protectSprintf($s) + public static function protectSprintf(string $s): string { return str_replace('%', '%%', $s); } /** - * @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 - * * @return string Encoded URL */ - public static function base64UrlEncode($s, $strip_padding = false) + public static function base64UrlEncode(string $s, bool $strip_padding = false): string { $s = strtr(base64_encode($s), '+/', '-_'); @@ -259,19 +258,14 @@ class Strings } /** - * @brief Decode Base64 Encoded URL and translate -_ to +/ - * @param string $s URL to decode + * Decode Base64 Encoded URL and translate -_ to +/ * + * @param string $s URL to decode * @return string Decoded URL * @throws \Exception */ - public static function base64UrlDecode($s) + public static function base64UrlDecode(string $s): string { - if (is_array($s)) { - Logger::log('base64url_decode: illegal input: ' . print_r(debug_backtrace(), true)); - return $s; - } - /* * // Placeholder for new rev of salmon which strips base64 padding. * // PHP base64_decode handles the un-padded input without requiring this step @@ -292,32 +286,30 @@ class Strings } /** - * @brief Normalize url + * Normalize url * * @param string $url URL to be normalized. - * * @return string Normalized URL. */ - public static function normaliseLink($url) + public static function normaliseLink(string $url): string { $ret = str_replace(['https:', '//www.'], ['http:', '//'], $url); return rtrim($ret, '/'); } /** - * @brief Normalize OpenID identity + * Normalize OpenID identity * * @param string $s OpenID Identity - * * @return string normalized OpenId Identity */ - public static function normaliseOpenID($s) + public static function normaliseOpenID(string $s): string { return trim(str_replace(['http://', 'https://'], ['', ''], $s), '/'); } /** - * @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. @@ -327,7 +319,7 @@ class Strings * @return boolean True if the URLs match, otherwise False * */ - public static function compareLink($a, $b) + public static function compareLink(string $a, string $b): bool { return (strcasecmp(self::normaliseLink($a), self::normaliseLink($b)) === 0); } @@ -338,7 +330,7 @@ class Strings * @param string $uri * @return string */ - public static function ensureQueryParameter($uri) + public static function ensureQueryParameter(string $uri): string { if (strpos($uri, '?') === false && ($pos = strpos($uri, '&')) !== false) { $uri = substr($uri, 0, $pos) . '?' . substr($uri, $pos + 1); @@ -351,23 +343,53 @@ class Strings * Check if the trimmed provided string is starting with one of the provided characters * * @param string $string - * @param array $chars + * @param array $chars + * * @return bool */ - public static function startsWith($string, array $chars) + public static function startsWithChars(string $string, array $chars): bool { $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): bool + { + $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): bool + { + return (substr_compare($string, $end, -strlen($end)) === 0); + } + /** * Returns the regular expression string to match URLs in a given text * * @return string * @see https://daringfireball.net/2010/07/improved_regex_for_matching_urls */ - public static function autoLinkRegEx() + public static function autoLinkRegEx(): string { return '@ (? $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 + */ + public static function performWithEscapedBlocks(string $text, string $regex, callable $callback): string + { + // 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; + } }