You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
248 lines
6.1 KiB
PHP
248 lines
6.1 KiB
PHP
<?php
|
|
/**
|
|
* The String helpers.
|
|
*
|
|
* @since 1.0.0
|
|
* @package RankMath
|
|
* @subpackage RankMath\Helpers
|
|
* @author RankMath <support@rankmath.com>
|
|
*/
|
|
|
|
namespace RankMath\Helpers;
|
|
|
|
/**
|
|
* Str class.
|
|
*/
|
|
class Str {
|
|
|
|
/**
|
|
* Validates whether the passed variable is a empty string.
|
|
*
|
|
* @param mixed $variable The variable to validate.
|
|
*
|
|
* @return bool Whether or not the passed value is a non-empty string.
|
|
*/
|
|
public static function is_empty( $variable ) {
|
|
return empty( $variable ) || ! is_string( $variable );
|
|
}
|
|
|
|
/**
|
|
* Validates whether the passed variable is a non-empty string.
|
|
*
|
|
* @param mixed $variable The variable to validate.
|
|
*
|
|
* @return bool Whether or not the passed value is a non-empty string.
|
|
*/
|
|
public static function is_non_empty( $variable ) {
|
|
return is_string( $variable ) && '' !== $variable;
|
|
}
|
|
|
|
/**
|
|
* Check if the string contains the given value.
|
|
*
|
|
* @param string $needle The sub-string to search for.
|
|
* @param string $haystack The string to search.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public static function contains( $needle, $haystack ) {
|
|
return self::is_non_empty( $needle ) ? strpos( $haystack, $needle ) !== false : false;
|
|
}
|
|
|
|
/**
|
|
* Check if the string begins with the given value.
|
|
*
|
|
* @param string $needle The sub-string to search for.
|
|
* @param string $haystack The string to search.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public static function starts_with( $needle, $haystack ) {
|
|
return '' === $needle || substr( $haystack, 0, strlen( $needle ) ) === (string) $needle;
|
|
}
|
|
|
|
/**
|
|
* Check if the string end with the given value.
|
|
*
|
|
* @param string $needle The sub-string to search for.
|
|
* @param string $haystack The string to search.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public static function ends_with( $needle, $haystack ) {
|
|
return '' === $needle || substr( $haystack, -strlen( $needle ) ) === (string) $needle;
|
|
}
|
|
|
|
/**
|
|
* Check the string for desired comparison.
|
|
*
|
|
* @param string $needle The sub-string to search for.
|
|
* @param string $haystack The string to search.
|
|
* @param string $comparison The type of comparison.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public static function comparison( $needle, $haystack, $comparison = '' ) {
|
|
|
|
$hash = [
|
|
'regex' => 'preg_match',
|
|
'end' => [ __CLASS__, 'ends_with' ],
|
|
'start' => [ __CLASS__, 'starts_with' ],
|
|
'contains' => [ __CLASS__, 'contains' ],
|
|
];
|
|
|
|
if ( $comparison && isset( $hash[ $comparison ] ) ) {
|
|
return call_user_func( $hash[ $comparison ], $needle, $haystack );
|
|
}
|
|
|
|
// Exact.
|
|
return $needle === $haystack;
|
|
}
|
|
|
|
/**
|
|
* Convert string to array with defined seprator.
|
|
*
|
|
* @param string $str String to convert.
|
|
* @param string $sep Seprator.
|
|
*
|
|
* @return bool|array
|
|
*/
|
|
public static function to_arr( $str, $sep = ',' ) {
|
|
$parts = explode( $sep, trim( $str ) );
|
|
|
|
return empty( $parts ) ? false : $parts;
|
|
}
|
|
|
|
/**
|
|
* Convert string to array, weed out empty elements and whitespaces.
|
|
*
|
|
* @param string $str User-defined list.
|
|
* @param string $sep_pattern Separator pattern for regex.
|
|
*
|
|
* @return array
|
|
*/
|
|
public static function to_arr_no_empty( $str, $sep_pattern = '\r\n|[\r\n]' ) {
|
|
$array = empty( $str ) ? [] : preg_split( '/' . $sep_pattern . '/', $str, -1, PREG_SPLIT_NO_EMPTY );
|
|
$array = array_filter( array_map( 'trim', $array ) );
|
|
|
|
return $array;
|
|
}
|
|
|
|
/**
|
|
* This function transforms the php.ini notation for numbers (like '2M') to an integer.
|
|
*
|
|
* @param string $size The size.
|
|
*
|
|
* @return int
|
|
*/
|
|
public static function let_to_num( $size ) {
|
|
$char = substr( $size, -1 );
|
|
$ret = substr( $size, 0, -1 );
|
|
|
|
// @codingStandardsIgnoreStart
|
|
switch ( strtoupper( $char ) ) {
|
|
case 'P':
|
|
$ret *= 1024;
|
|
case 'T':
|
|
$ret *= 1024;
|
|
case 'G':
|
|
$ret *= 1024;
|
|
case 'M':
|
|
$ret *= 1024;
|
|
case 'K':
|
|
$ret *= 1024;
|
|
}
|
|
// @codingStandardsIgnoreEnd
|
|
|
|
return $ret;
|
|
}
|
|
|
|
/**
|
|
* Convert a number to K, M, B, etc.
|
|
*
|
|
* @param int|double $number Number which to convert to pretty string.
|
|
* @param int $precision Decimal places in the human-readable format.
|
|
*
|
|
* @return string
|
|
*/
|
|
public static function human_number( $number, $precision = 1 ) {
|
|
|
|
if ( ! is_numeric( $number ) ) {
|
|
return 0;
|
|
}
|
|
|
|
$negative = '';
|
|
if ( abs( $number ) != $number ) {
|
|
$negative = '-';
|
|
$number = abs( $number );
|
|
}
|
|
|
|
if ( $number < 1000 ) {
|
|
return $negative ? -1 * $number : $number;
|
|
}
|
|
|
|
$unit = intval( log( $number, 1000 ) );
|
|
$units = [ '', 'K', 'M', 'B', 'T', 'Q' ];
|
|
|
|
if ( array_key_exists( $unit, $units ) ) {
|
|
return sprintf( '%s%s%s', $negative, rtrim( number_format( $number / pow( 1000, $unit ), $precision ), '.0' ), $units[ $unit ] );
|
|
}
|
|
|
|
return $number;
|
|
}
|
|
|
|
/**
|
|
* Truncate text for given length.
|
|
*
|
|
* @param {string} $str Text to truncate.
|
|
* @param {number} $length Length to truncate for.
|
|
* @param {string} $append Append to the end if string is truncated.
|
|
*
|
|
* @return {string} Truncated text.
|
|
*/
|
|
public static function truncate( $str, $length = 110, $append = '' ) {
|
|
$str = wp_strip_all_tags( $str, true );
|
|
$strlen = mb_strlen( $str );
|
|
$excerpt = mb_substr( $str, 0, $length );
|
|
|
|
// Remove part of an entity at the end.
|
|
$excerpt = preg_replace( '/&[^;\s]{0,6}$/', '', $excerpt );
|
|
if ( $str !== $excerpt ) {
|
|
$strrpos = function_exists( 'mb_strrpos' ) ? 'mb_strrpos' : 'strrpos';
|
|
$excerpt = mb_substr( $str, 0, $strrpos( trim( $excerpt ), ' ' ) );
|
|
}
|
|
|
|
if ( $strlen > $length ) {
|
|
$excerpt .= $append;
|
|
}
|
|
|
|
return $excerpt;
|
|
}
|
|
|
|
/**
|
|
* Multibyte ucwords.
|
|
*
|
|
* @param string $string String to convert.
|
|
*/
|
|
public static function mb_ucwords( $string ) {
|
|
if ( ! function_exists( 'mb_convert_case' ) || ! function_exists( 'mb_detect_encoding' ) || mb_detect_encoding( $string ) !== 'UTF-8' ) {
|
|
return ucwords( $string );
|
|
}
|
|
|
|
$words = preg_split( '/([\s]+)/u', $string, -1, PREG_SPLIT_DELIM_CAPTURE );
|
|
$ucwords = '';
|
|
foreach ( $words as $word ) {
|
|
if ( is_numeric( $word ) ) {
|
|
$ucwords .= $word;
|
|
continue;
|
|
}
|
|
|
|
if ( ! empty( $word[0] ) ) {
|
|
$ucwords .= preg_match( '/[\p{L}]/u', $word[0] ) ? mb_strtoupper( $word[0], 'UTF-8' ) . mb_substr( $word, 1, mb_strlen( $word ), 'UTF-8' ) : $word;
|
|
}
|
|
}
|
|
|
|
return $ucwords;
|
|
}
|
|
}
|