405 Zeilen
15 KiB
PHP
405 Zeilen
15 KiB
PHP
<?php
|
|
|
|
/**
|
|
* This file contains the multi byte wrapper class for strings.
|
|
*
|
|
* @package Core
|
|
* @subpackage Util
|
|
* @author Frederic Schneider <frederic.schneider@4fb.de>
|
|
* @author Marcus Gnaß <marcus.gnass@4fb.de>
|
|
* @copyright four for business AG <www.4fb.de>
|
|
* @license http://www.contenido.org/license/LIZENZ.txt
|
|
* @link http://www.4fb.de
|
|
* @link http://www.contenido.org
|
|
*/
|
|
|
|
defined('CON_FRAMEWORK') || die('Illegal call: Missing framework initialization - request aborted.');
|
|
|
|
/**
|
|
* Wrapper class for mbstring functions to be used with strings.
|
|
*
|
|
* Each method is a wrapper for a mbstring function that implements a fallback
|
|
* to the regular string function if the mbstring function does not exist
|
|
* or the mbstring extension itself is not available.
|
|
*
|
|
* @package Core
|
|
* @subpackage Util
|
|
* @todo add mb_chr(), mb_ord()
|
|
*/
|
|
class cStringMultiByteWrapper {
|
|
|
|
/**
|
|
* Checks if a given mbstring function exists.
|
|
*
|
|
* Caches informations about existing mbstring functions for better
|
|
* performance.
|
|
*
|
|
* @param string $functionName
|
|
* @return bool
|
|
*/
|
|
protected static function _functionExists($functionName) {
|
|
static $cache;
|
|
if (!isset($cache)) {
|
|
$cache = array();
|
|
foreach (array(
|
|
'mb_strtolower', 'mb_strtoupper', 'mb_strlen', 'mb_substr',
|
|
'mb_substr_count', 'mb_send_mail', 'mb_strpos', 'mb_strrpos', 'mb_stripos',
|
|
'mb_strripos', 'mb_stristr', 'mb_strrchr'
|
|
) as $function) {
|
|
$cache[$function] = function_exists($function);
|
|
}
|
|
}
|
|
return isset($cache[$functionName]) ? $cache[$functionName] : false;
|
|
}
|
|
|
|
/**
|
|
* Determines multi byte encoding to be used for various mbstring functions.
|
|
*
|
|
* If NULL is given the encoding for the current language is used
|
|
* which tends to be awfully slow as it requires a database lookup!
|
|
*
|
|
* If none could be determined the current set encoding is used.
|
|
*
|
|
* @param string|null $encoding
|
|
* - give a string to use a specific encoding
|
|
* - give null to use the encoding of the current language
|
|
* @return string
|
|
*/
|
|
protected static function _getEncoding($encoding = null) {
|
|
if (!is_string($encoding)) {
|
|
$encoding = mb_internal_encoding();
|
|
}
|
|
return $encoding;
|
|
}
|
|
|
|
/**
|
|
* Make a string lowercase
|
|
*
|
|
* @param string $string
|
|
* The string being lowercased
|
|
* @param string|null $encoding
|
|
* encoding parameter, standard: cRegistry::getEncoding()
|
|
* @return string
|
|
* with all alphabetic characters converted to lowercases
|
|
* @link http://php.net/manual/de/function.mb-strtolower.php
|
|
*/
|
|
public static function toLowerCase($string, $encoding = null) {
|
|
if (self::_functionExists('mb_strtolower')) {
|
|
$result = mb_strtolower($string, self::_getEncoding($encoding));
|
|
} else {
|
|
$result = strtolower($string);
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Make a string uppercase
|
|
*
|
|
* @param string $string
|
|
* The string being uppercased
|
|
* @param string|null $encoding
|
|
* encoding parameter, standard: cRegistry::getEncoding()
|
|
* @return string
|
|
* with all alphabetic characters converted to uppercases
|
|
* @link http://php.net/manual/de/function.mb-strtoupper.php
|
|
*/
|
|
public static function toUpperCase($string, $encoding = null) {
|
|
if (self::_functionExists('mb_strtoupper')) {
|
|
$result = mb_strtoupper($string, self::_getEncoding($encoding));
|
|
} else {
|
|
$result = strtoupper($string);
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Get string length
|
|
*
|
|
* @param string $string
|
|
* The string being checked for length
|
|
* @param string|null $encoding
|
|
* encoding parameter, standard: cRegistry::getEncoding()
|
|
* @return int
|
|
* Returns the number of characters
|
|
* @link http://php.net/manual/de/function.mb-strlen.php
|
|
*/
|
|
public static function getStringLength($string, $encoding = null) {
|
|
if (self::_functionExists('mb_strlen')) {
|
|
$result = mb_strlen($string, self::_getEncoding($encoding));
|
|
} else {
|
|
$result = strlen($string);
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Get string length
|
|
*
|
|
* @param string $string
|
|
* The string to extract the substring form
|
|
* @param int $start
|
|
* @param int $length [Optional]
|
|
* Maximum number of characters to use from $string, standard is NULL
|
|
* @param string|null $encoding
|
|
* encoding parameter, standard: cRegistry::getEncoding()
|
|
* @return string
|
|
* Returns the number of characters
|
|
* @link http://php.net/manual/de/function.mb-substr.php
|
|
*/
|
|
public static function getPartOfString($string, $start, $length = null, $encoding = null) {
|
|
if (self::_functionExists('mb_substr')) {
|
|
$result = mb_substr($string, $start, $length, self::_getEncoding($encoding));
|
|
} else {
|
|
$result = substr($string, $start, $length);
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Count the number of substring occurences
|
|
*
|
|
* @param string $haystack
|
|
* The string being checked
|
|
* @param string $needle
|
|
* The string being found
|
|
* @param string|null $encoding
|
|
* encoding parameter, standard: cRegistry::getEncoding()
|
|
* @return int
|
|
* The number of times the needle substring occurs in the haystack string.
|
|
* @link http://php.net/manual/de/function.mb-substr-count.php
|
|
*/
|
|
public static function countSubstring($haystack, $needle, $encoding = null) {
|
|
if (self::_functionExists('mb_substr_count')) {
|
|
$result = mb_substr_count($haystack, $needle, self::_getEncoding($encoding));
|
|
} else {
|
|
$result = substr_count($haystack, $needle);
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Send encoded mail
|
|
*
|
|
* @param string $to
|
|
* The mail addresses being sent to (multiple recipents comma separated)
|
|
* @param string $subject
|
|
* The subject of the mail
|
|
* @param string $message
|
|
* The message of the mail
|
|
* @param string $additional_headers [Optional]
|
|
* @param string $additional_parameter [Optional]
|
|
* @return boolean
|
|
* true or false
|
|
* @link http://php.net/manual/de/function.mb-send-mail.php
|
|
*/
|
|
public static function mail($to, $subject, $message, $additional_headers = null, $additional_parameter = null) {
|
|
if (self::_functionExists('mb_send_mail')) {
|
|
$result = mb_send_mail($to, $subject, $message, $additional_headers, $additional_parameter);
|
|
} else {
|
|
$result = mail($to, $subject, $message, $additional_headers, $additional_parameter);
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Find the position of first occurence of string in a string
|
|
*
|
|
* @param string $haystack
|
|
* @param string $needle
|
|
* @param integer $offset [Optional]
|
|
* @param string|null $encoding
|
|
* encoding parameter, standard: cRegistry::getEncoding()
|
|
* @return int
|
|
* Returns the numeric position of the first occurrence of needle in the haystack string
|
|
* @link http://php.net/manual/de/function.mb-strpos.php
|
|
*/
|
|
public static function findFirstPos($haystack, $needle, $offset = 0, $encoding = null) {
|
|
if (self::_functionExists('mb_strpos')) {
|
|
$result = mb_strpos($haystack, $needle, $offset, self::_getEncoding($encoding));
|
|
} else {
|
|
$result = strpos($haystack, $needle, $offset);
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Find the position of last occurence of string in a string
|
|
*
|
|
* @param string $haystack
|
|
* @param string $needle
|
|
* @param integer $offset [Optional]
|
|
* @param string|null $encoding
|
|
* encoding parameter, standard: cRegistry::getEncoding()
|
|
* @return int
|
|
* Returns the numeric position of the last occurrence of needle in the haystack string
|
|
* @link http://php.net/manual/de/function.mb-strrpos.php
|
|
*/
|
|
public static function findLastPos($haystack, $needle, $offset = 0, $encoding = null) {
|
|
if (self::_functionExists('mb_strrpos')) {
|
|
$result = mb_strrpos($haystack, $needle, $offset, self::_getEncoding($encoding));
|
|
} else {
|
|
$result = strrpos($haystack, $needle, $offset);
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Finds position of first occurrence of a string within another, case insensitive
|
|
*
|
|
* @param string $haystack
|
|
* @param string $needle
|
|
* @param integer $offset [Optional]
|
|
* @param string|null $encoding
|
|
* encoding parameter, standard: cRegistry::getEncoding()
|
|
* @return int
|
|
* Returns the numeric position of the first occurrence of needle in the haystack string
|
|
* @link http://php.net/manual/de/function.mb-stripos.php
|
|
*/
|
|
public static function findFirstPosCI($haystack, $needle, $offset = 0, $encoding = null) {
|
|
if (self::_functionExists('mb_stripos')) {
|
|
$result = mb_stripos($haystack, $needle, $offset, self::_getEncoding($encoding));
|
|
} else {
|
|
$result = stripos($haystack, $needle, $offset);
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Finds position of last occurrence of a string within another, case insensitive
|
|
*
|
|
* @param string $haystack
|
|
* @param string $needle
|
|
* @param integer $offset [Optional]
|
|
* @param string|null $encoding
|
|
* encoding parameter, standard: cRegistry::getEncoding()
|
|
* @return int
|
|
* Returns the numeric position of the last occurrence of needle in the haystack string
|
|
* @link http://php.net/manual/de/function.mb-strripos.php
|
|
*/
|
|
public static function findLastPosCI($haystack, $needle, $offset = 0, $encoding = null) {
|
|
if (self::_functionExists('mb_strripos')) {
|
|
$result = mb_strripos($haystack, $needle, $offset, self::_getEncoding($encoding));
|
|
} else {
|
|
$result = strripos($haystack, $needle, $offset);
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Finds first occurrence of a string within another, case insensitive
|
|
*
|
|
* @param string $haystack
|
|
* @param string $needle
|
|
* @param boolean $before_needle [Optional]
|
|
* @param string|null $encoding
|
|
* encoding parameter, standard: cRegistry::getEncoding()
|
|
* @return string
|
|
* Returns the portion of haystack, or FALSE if needle is not found.
|
|
* @link http://php.net/manual/de/function.mb-stristr.php
|
|
*/
|
|
public static function findFirstOccurrenceCI($haystack, $needle, $before_needle = false, $encoding = null) {
|
|
if (self::_functionExists('mb_stristr')) {
|
|
$result = mb_stristr($haystack, $needle, $before_needle, self::_getEncoding($encoding));
|
|
} else {
|
|
$result = stristr($haystack, $needle, $before_needle);
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Finds first occurrence of a string within another, case insensitive
|
|
*
|
|
* @param string $haystack
|
|
* @param string $needle
|
|
* @param boolean $part [Optional]
|
|
* @param string|null $encoding
|
|
* encoding parameter, standard: cRegistry::getEncoding()
|
|
* @return string
|
|
* Returns the portion of haystack, or FALSE if needle is not found.
|
|
* @link http://php.net/manual/de/function.mb-strrchr.php
|
|
*/
|
|
public static function findLastOccurrence($haystack, $needle, $part = false, $encoding = null) {
|
|
if (self::_functionExists('mb_strrchr')) {
|
|
$result = mb_strrchr($haystack, $needle, $part, self::_getEncoding($encoding));
|
|
} elseif (!$part) {
|
|
$result = strrchr($haystack, $needle);
|
|
} else {
|
|
// TODO strrchr canot handle $part = true
|
|
$result = null;
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Regular expression match
|
|
*
|
|
* @param string $pattern
|
|
* @param string $string
|
|
* @param array $regs [Optional]
|
|
* @return int
|
|
* @link http://php.net/manual/de/function.mb-ereg.php
|
|
*/
|
|
public static function ereg($pattern, $string, &$regs = array()) {
|
|
// TODO provide fallback multibyte extension is missing
|
|
return mb_ereg($pattern, $string, $regs);
|
|
}
|
|
|
|
/**
|
|
* Regular expression match ignoring case
|
|
*
|
|
* @param string $pattern
|
|
* @param string $string
|
|
* @param array $regs [Optional]
|
|
* @return int Returns the byte length of the matched string if a match for pattern was found in string
|
|
* @link http://php.net/manual/de/function.mb-eregi.php
|
|
*/
|
|
public static function eregi($pattern, $string, &$regs = array()) {
|
|
// TODO provide fallback multibyte extension is missing
|
|
return mb_eregi($pattern, $string, $regs);
|
|
}
|
|
|
|
/**
|
|
* Replace regular expression
|
|
*
|
|
* @param string $pattern
|
|
* @param string $replacement
|
|
* @param string $string
|
|
* @param string $option [Optional]
|
|
* @return false|string Returns the byte length of the matched string if a match for pattern was found in string
|
|
* @link http://php.net/manual/de/function.mb-ereg-replace.php
|
|
*/
|
|
public static function ereg_replace($pattern, $replacement, $string, $option = 'msr') {
|
|
// TODO provide fallback multibyte extension is missing
|
|
return mb_ereg_replace($pattern, $replacement, $string, $option);
|
|
}
|
|
|
|
/**
|
|
* Replace regular expression ignoring case
|
|
*
|
|
* @param string $pattern
|
|
* @param string $replacement
|
|
* @param string $string
|
|
* @param string $option [Optional]
|
|
* @return false|string Returns the byte length of the matched string if a match for pattern was found in string
|
|
* @link http://php.net/manual/de/function.mb-eregi-replace.php
|
|
*/
|
|
public static function eregi_replace($pattern, $replacement, $string, $option = 'msr') {
|
|
// TODO provide fallback multibyte extension is missing
|
|
return mb_eregi_replace($pattern, $replacement, $string, $option);
|
|
}
|
|
|
|
/**
|
|
* Split string using regular expression
|
|
*
|
|
* @param string $pattern
|
|
* @param string $string
|
|
* @param integer $limit [Optional]
|
|
* @return string[] The result as an array
|
|
* @link http://php.net/manual/de/function.mb-split.php
|
|
*/
|
|
public static function split($pattern, $string, $limit = -1) {
|
|
// TODO provide fallback multibyte extension is missing
|
|
return mb_split($pattern, $string, $limit);
|
|
}
|
|
|
|
}
|