agent/php/ElasticApm/Impl/Util/TextUtil.php (160 lines of code) (raw):

<?php /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch B.V. licenses this file to you under * the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ declare(strict_types=1); namespace Elastic\Apm\Impl\Util; /** * Code in this file is part of implementation internals and thus it is not covered by the backward compatibility. * * @internal */ final class TextUtil { use StaticClassTrait; public static function ensureMaxLength(string $text, int $maxLength): string { if (strlen($text) <= $maxLength) { return $text; } return substr($text, /* start: */ 0, /* length: */ $maxLength); } public static function isEmptyString(string $str): bool { return $str === ''; } public static function isNullOrEmptyString(?string $str): bool { return $str === null || self::isEmptyString($str); } public static function isUpperCaseLetter(int $charAsInt): bool { return NumericUtil::isInClosedInterval(ord('A'), $charAsInt, ord('Z')); } public static function isLowerCaseLetter(int $charAsInt): bool { return NumericUtil::isInClosedInterval(ord('a'), $charAsInt, ord('z')); } public static function isLetter(int $charAsInt): bool { return self::isUpperCaseLetter($charAsInt) || self::isLowerCaseLetter($charAsInt); } public static function toLowerCaseLetter(int $charAsInt): int { if (self::isUpperCaseLetter($charAsInt)) { return (($charAsInt - ord('A')) + ord('a')); } return $charAsInt; } public static function toUpperCaseLetter(int $charAsInt): int { if (self::isLowerCaseLetter($charAsInt)) { return (($charAsInt - ord('a')) + ord('A')); } return $charAsInt; } public static function flipLetterCase(int $charAsInt): int { return self::isUpperCaseLetter($charAsInt) ? self::toLowerCaseLetter($charAsInt) : self::toUpperCaseLetter($charAsInt); } public static function camelToSnakeCase(string $input): string { $inputLen = strlen($input); $result = ''; $prevIndex = 0; for ($i = 0; $i != $inputLen; ++$i) { $currentCharAsInt = ord($input[$i]); if (!self::isUpperCaseLetter($currentCharAsInt)) { continue; } $result .= substr($input, $prevIndex, $i - $prevIndex); if ($i !== 0) { $result .= '_'; } $result .= chr(self::toLowerCaseLetter($currentCharAsInt)); $prevIndex = $i + 1; } if (self::isEmptyString($result)) { return $input; } $result .= substr($input, $prevIndex, $inputLen - $prevIndex); return $result; } public static function snakeToCamelCase(string $input): string { $inputLen = strlen($input); $result = ''; $inputRemainderPos = 0; while (true) { $underscorePos = strpos($input, '_', $inputRemainderPos); if ($underscorePos === false) { break; } $result .= substr($input, $inputRemainderPos, $underscorePos - $inputRemainderPos); $nonUnderscorePos = null; for ($i = $underscorePos; $i !== $inputLen; ++$i) { if ($input[$i] !== '_') { $nonUnderscorePos = $i; break; } } if ($nonUnderscorePos === null) { $inputRemainderPos = strlen($input); break; } // Don't uppercase the first letter if (self::isEmptyString($result)) { $result .= $input[$nonUnderscorePos]; } else { $result .= chr(self::toUpperCaseLetter(ord($input[$nonUnderscorePos]))); } if ($nonUnderscorePos === $inputRemainderPos - 1) { break; } $inputRemainderPos = $nonUnderscorePos + 1; } if ($inputRemainderPos === strlen($input)) { return $result; } if (self::isEmptyString($result)) { return $input; } return $result . substr($input, $inputRemainderPos, $inputLen - $inputRemainderPos); } /** * Convert camel case ('someText') to Pascal case ('SomeText') * * @param string $input * * @return string * * @noinspection PhpUnused */ public static function camelToPascalCase(string $input): string { if (self::isEmptyString($input)) { return ''; } return chr(self::toUpperCaseLetter(ord($input[0]))) . substr($input, 1, strlen($input) - 1); } public static function isPrefixOf(string $prefix, string $text, bool $isCaseSensitive = true): bool { $prefixLen = strlen($prefix); if ($prefixLen === 0) { return true; } /** @noinspection PhpStrictComparisonWithOperandsOfDifferentTypesInspection */ return substr_compare( $text /* <- haystack */, $prefix /* <- needle */, 0 /* <- offset */, $prefixLen /* <- length */, !$isCaseSensitive /* <- case_insensitivity */ ) === 0; } public static function isPrefixOfIgnoreCase(string $prefix, string $text): bool { return self::isPrefixOf($prefix, $text, /* isCaseSensitive: */ false); } public static function isSuffixOf(string $suffix, string $text, bool $isCaseSensitive = true): bool { $suffixLen = strlen($suffix); if ($suffixLen === 0) { return true; } return substr_compare( $text /* <- haystack */, $suffix /* <- needle */, -$suffixLen /* <- offset */, $suffixLen /* <- length */, !$isCaseSensitive /* <- case_insensitivity */ ) == 0; } public static function contains(string $haystack, string $needle): bool { return strpos($haystack, $needle) !== false; } }