You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
4.6 KiB
200 lines
4.6 KiB
4 years ago
|
<?php
|
||
|
|
||
|
/*
|
||
|
|
||
|
Copyright (c) 2009-2019 F3::Factory/Bong Cosca, All rights reserved.
|
||
|
|
||
|
This file is part of the Fat-Free Framework (http://fatfreeframework.com).
|
||
|
|
||
|
This is free software: you can redistribute it and/or modify it under the
|
||
|
terms of the GNU General Public License as published by the Free Software
|
||
|
Foundation, either version 3 of the License, or later.
|
||
|
|
||
|
Fat-Free Framework is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
|
General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License along
|
||
|
with Fat-Free Framework. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
*/
|
||
|
|
||
|
//! Unicode string manager
|
||
|
class UTF extends Prefab {
|
||
|
|
||
|
/**
|
||
|
* Get string length
|
||
|
* @return int
|
||
|
* @param $str string
|
||
|
**/
|
||
|
function strlen($str) {
|
||
|
preg_match_all('/./us',$str,$parts);
|
||
|
return count($parts[0]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Reverse a string
|
||
|
* @return string
|
||
|
* @param $str string
|
||
|
**/
|
||
|
function strrev($str) {
|
||
|
preg_match_all('/./us',$str,$parts);
|
||
|
return implode('',array_reverse($parts[0]));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Find position of first occurrence of a string (case-insensitive)
|
||
|
* @return int|FALSE
|
||
|
* @param $stack string
|
||
|
* @param $needle string
|
||
|
* @param $ofs int
|
||
|
**/
|
||
|
function stripos($stack,$needle,$ofs=0) {
|
||
|
return $this->strpos($stack,$needle,$ofs,TRUE);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Find position of first occurrence of a string
|
||
|
* @return int|FALSE
|
||
|
* @param $stack string
|
||
|
* @param $needle string
|
||
|
* @param $ofs int
|
||
|
* @param $case bool
|
||
|
**/
|
||
|
function strpos($stack,$needle,$ofs=0,$case=FALSE) {
|
||
|
return preg_match('/^(.{'.$ofs.'}.*?)'.
|
||
|
preg_quote($needle,'/').'/us'.($case?'i':''),$stack,$match)?
|
||
|
$this->strlen($match[1]):FALSE;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns part of haystack string from the first occurrence of
|
||
|
* needle to the end of haystack (case-insensitive)
|
||
|
* @return string|FALSE
|
||
|
* @param $stack string
|
||
|
* @param $needle string
|
||
|
* @param $before bool
|
||
|
**/
|
||
|
function stristr($stack,$needle,$before=FALSE) {
|
||
|
return $this->strstr($stack,$needle,$before,TRUE);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns part of haystack string from the first occurrence of
|
||
|
* needle to the end of haystack
|
||
|
* @return string|FALSE
|
||
|
* @param $stack string
|
||
|
* @param $needle string
|
||
|
* @param $before bool
|
||
|
* @param $case bool
|
||
|
**/
|
||
|
function strstr($stack,$needle,$before=FALSE,$case=FALSE) {
|
||
|
if (!$needle)
|
||
|
return FALSE;
|
||
|
preg_match('/^(.*?)'.preg_quote($needle,'/').'/us'.($case?'i':''),
|
||
|
$stack,$match);
|
||
|
return isset($match[1])?
|
||
|
($before?
|
||
|
$match[1]:
|
||
|
$this->substr($stack,$this->strlen($match[1]))):
|
||
|
FALSE;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Return part of a string
|
||
|
* @return string|FALSE
|
||
|
* @param $str string
|
||
|
* @param $start int
|
||
|
* @param $len int
|
||
|
**/
|
||
|
function substr($str,$start,$len=0) {
|
||
|
if ($start<0)
|
||
|
$start=$this->strlen($str)+$start;
|
||
|
if (!$len)
|
||
|
$len=$this->strlen($str)-$start;
|
||
|
return preg_match('/^.{'.$start.'}(.{0,'.$len.'})/us',$str,$match)?
|
||
|
$match[1]:FALSE;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Count the number of substring occurrences
|
||
|
* @return int
|
||
|
* @param $stack string
|
||
|
* @param $needle string
|
||
|
**/
|
||
|
function substr_count($stack,$needle) {
|
||
|
preg_match_all('/'.preg_quote($needle,'/').'/us',$stack,
|
||
|
$matches,PREG_SET_ORDER);
|
||
|
return count($matches);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Strip whitespaces from the beginning of a string
|
||
|
* @return string
|
||
|
* @param $str string
|
||
|
**/
|
||
|
function ltrim($str) {
|
||
|
return preg_replace('/^[\pZ\pC]+/u','',$str);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Strip whitespaces from the end of a string
|
||
|
* @return string
|
||
|
* @param $str string
|
||
|
**/
|
||
|
function rtrim($str) {
|
||
|
return preg_replace('/[\pZ\pC]+$/u','',$str);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Strip whitespaces from the beginning and end of a string
|
||
|
* @return string
|
||
|
* @param $str string
|
||
|
**/
|
||
|
function trim($str) {
|
||
|
return preg_replace('/^[\pZ\pC]+|[\pZ\pC]+$/u','',$str);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Return UTF-8 byte order mark
|
||
|
* @return string
|
||
|
**/
|
||
|
function bom() {
|
||
|
return chr(0xef).chr(0xbb).chr(0xbf);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convert code points to Unicode symbols
|
||
|
* @return string
|
||
|
* @param $str string
|
||
|
**/
|
||
|
function translate($str) {
|
||
|
return html_entity_decode(
|
||
|
preg_replace('/\\\\u([[:xdigit:]]+)/i','&#x\1;',$str));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Translate emoji tokens to Unicode font-supported symbols
|
||
|
* @return string
|
||
|
* @param $str string
|
||
|
**/
|
||
|
function emojify($str) {
|
||
|
$map=[
|
||
|
':('=>'\u2639', // frown
|
||
|
':)'=>'\u263a', // smile
|
||
|
'<3'=>'\u2665', // heart
|
||
|
':D'=>'\u1f603', // grin
|
||
|
'XD'=>'\u1f606', // laugh
|
||
|
';)'=>'\u1f609', // wink
|
||
|
':P'=>'\u1f60b', // tongue
|
||
|
':,'=>'\u1f60f', // think
|
||
|
':/'=>'\u1f623', // skeptic
|
||
|
'8O'=>'\u1f632', // oops
|
||
|
]+Base::instance()->EMOJI;
|
||
|
return $this->translate(str_replace(array_keys($map),
|
||
|
array_values($map),$str));
|
||
|
}
|
||
|
|
||
|
}
|