Created
January 23, 2018 15:45
-
-
Save alexey-kar/21e4a0b5bf6cebb7b58a83f04d13cd53 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<? | |
namespace MCArt\Olap; | |
use Bitrix\Main\Entity; | |
IncludeModuleLangFile(__FILE__); | |
/* | |
https://dev.1c-bitrix.ru/support/forum/forum6/topic60926/ | |
Теперь достаточно в скрипте, где используем транслитерацию определить | |
use \CUtilEx as CUtil; | |
и всё заработает! | |
Если у вас сайт в cp1251, то в классе замените | |
$chr = mb_substr($str, $i, 1, "UTF-8"); | |
на | |
$chr = mb_substr($str, $i, 1, "windows-1251"); | |
*/ | |
class CUtilEx extends \CUtil{ | |
private static function mb_strtr($str, $from, $to) | |
{ | |
return str_replace(\CUtilEx::mb_str_split($from), \CUtilEx::mb_str_split($to), $str); | |
} | |
private static function mb_str_split($str) { | |
return preg_split('~~u', $str, null, PREG_SPLIT_NO_EMPTY); | |
} | |
private static function ToUpper($str, $lang = false) | |
{ | |
static $lower = array(); | |
static $upper = array(); | |
if(!defined("BX_CUSTOM_TO_UPPER_FUNC")) | |
{ | |
if(defined("BX_UTF")) | |
{ | |
return mb_strtoupper($str); | |
} | |
else | |
{ | |
if($lang === false) | |
$lang = LANGUAGE_ID; | |
if(!isset($lower[$lang])) | |
{ | |
$arMsg = IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/tools.php", $lang, true); | |
$lower[$lang] = $arMsg["ABC_LOWER"]; | |
$upper[$lang] = $arMsg["ABC_UPPER"]; | |
} | |
return mb_strtoupper(\CUtilEx::mb_strtr($str, $lower[$lang], $upper[$lang])); | |
} | |
} | |
else | |
{ | |
$func = BX_CUSTOM_TO_UPPER_FUNC; | |
return $func($str); | |
} | |
} | |
private static function ToLower($str, $lang = false) | |
{ | |
static $lower = array(); | |
static $upper = array(); | |
if(!defined("BX_CUSTOM_TO_LOWER_FUNC")) | |
{ | |
if(defined("BX_UTF")) | |
{ | |
return mb_strtolower($str); | |
} | |
else | |
{ | |
if($lang === false) | |
$lang = LANGUAGE_ID; | |
if(!isset($lower[$lang])) | |
{ | |
$arMsg = IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/tools.php", $lang, true); | |
$lower[$lang] = $arMsg["ABC_LOWER"]; | |
$upper[$lang] = $arMsg["ABC_UPPER"]; | |
} | |
return mb_strtolower(\CUtilEx::mb_strtr($str, $upper[$lang], $lower[$lang])); | |
} | |
} | |
else | |
{ | |
$func = BX_CUSTOM_TO_LOWER_FUNC; | |
return $func($str); | |
} | |
} | |
public static function translit($str, $lang, $params = array()) | |
{ | |
static $search = array(); | |
if(!isset($search[$lang])) | |
{ | |
$mess = IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/js_core_translit.php", $lang, true); | |
$trans_from = explode(",", $mess["TRANS_FROM"]); | |
$trans_to = explode(",", $mess["TRANS_TO"]); | |
foreach($trans_from as $i => $from) | |
$search[$lang][$from] = $trans_to[$i]; | |
} | |
$defaultParams = array( | |
"max_len" => 100, | |
"change_case" => "L", // 'L' - toLower, 'U' - toUpper, false - do not change | |
"replace_space" => '_', | |
"replace_other" => '_', | |
"delete_repeat_replace" => true, | |
"safe_chars" => '', | |
); | |
foreach($defaultParams as $key => $value) | |
if(!array_key_exists($key, $params)) | |
$params[$key] = $value; | |
$len = mb_strlen($str); | |
$str_new = ''; | |
$last_chr_new = ''; | |
for($i = 0; $i < $len; $i++) | |
{ | |
$chr = mb_substr($str, $i, 1, "UTF-8"); | |
if(preg_match("/[a-zA-Z0-9]/".BX_UTF_PCRE_MODIFIER, $chr) || mb_strpos($params["safe_chars"], $chr)!==false) | |
{ | |
$chr_new = $chr; | |
} | |
elseif(preg_match("/\\s/".BX_UTF_PCRE_MODIFIER, $chr)) | |
{ | |
if ( | |
!$params["delete_repeat_replace"] | |
|| | |
($i > 0 && $last_chr_new != $params["replace_space"]) | |
) | |
$chr_new = $params["replace_space"]; | |
else | |
$chr_new = ''; | |
} | |
else | |
{ | |
if($search[$lang][$chr]) | |
{ | |
$chr_new = $search[$lang][$chr]; | |
} | |
else | |
{ | |
if ( | |
!$params["delete_repeat_replace"] | |
|| | |
($i > 0 && $i != $len-1 && $last_chr_new != $params["replace_other"]) | |
) | |
$chr_new = $params["replace_other"]; | |
else | |
$chr_new = ''; | |
} | |
} | |
if(mb_strlen($chr_new)) | |
{ | |
if($params["change_case"] == "L" || $params["change_case"] == "l") | |
$chr_new = \CUtilEx::ToLower($chr_new); | |
elseif($params["change_case"] == "U" || $params["change_case"] == "u") | |
$chr_new = \CUtilEx::ToUpper($chr_new); | |
$str_new .= $chr_new; | |
$last_chr_new = $chr_new; | |
} | |
if (mb_strlen($str_new) >= $params["max_len"]) | |
break; | |
} | |
$str_new = trim($str_new, $params['replace_space'] . $params['replace_other']); | |
return $str_new; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment