1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
util.php
См. документацию.
1<?php
2
7
8class CUtil
9{
10 public static function addslashes($s)
11 {
12 static $aSearch = ["\\", "\"", "'"];
13 static $aReplace = ["\\\\", '\\"', "\\'"];
14 return str_replace($aSearch, $aReplace, $s);
15 }
16
17 public static function closetags($html)
18 {
19 preg_match_all("#<([a-z0-9]+)([^>]*)(?<!/)>#iu", $html, $result);
20 $openedtags = $result[1];
21
22 preg_match_all("#</([a-z0-9]+)>#iu", $html, $result);
23 $closedtags = $result[1];
24 $len_opened = count($openedtags);
25
26 if (count($closedtags) == $len_opened)
27 {
28 return $html;
29 }
30
31 $openedtags = array_reverse($openedtags);
32
33 for ($i = 0; $i < $len_opened; $i++)
34 {
35 if (!in_array($openedtags[$i], $closedtags))
36 {
37 $html .= '</' . $openedtags[$i] . '>';
38 }
39 else
40 {
41 unset($closedtags[array_search($openedtags[$i], $closedtags)]);
42 }
43 }
44
45 return $html;
46 }
47
48 public static function JSEscape($s)
49 {
50 static $aSearch = ["\xe2\x80\xa9", "\\", "'", "\"", "\r\n", "\r", "\n", "\xe2\x80\xa8", "*/", "</"];
51 static $aReplace = [" ", "\\\\", "\\'", '\\"', "\n", "\n", "\\n", "\\n", "*\\/", "<\\/"];
52 $val = str_replace($aSearch, $aReplace, $s);
53 return $val;
54 }
55
56 public static function JSUrlEscape($s)
57 {
58 static $aSearch = ["%27", "%5C", "%0A", "%0D", "%", "&#039;", "&#39;", "&#x27;", "&apos;"];
59 static $aReplace = ["\\'", "\\\\", "\\n", "\\r", "%25", "\\'", "\\'", "\\'", "\\'"];
60 return str_replace($aSearch, $aReplace, $s);
61 }
62
66 public static function PhpToJSObject($arData, $bWS = false, $bSkipTilda = false, $bExtType = false)
67 {
68 static $use_bx_encode = null;
69 if (!isset($use_bx_encode))
70 {
71 $use_bx_encode = function_exists('bx_js_encode');
72 }
73 if ($use_bx_encode)
74 {
75 return bx_js_encode($arData, $bWS, $bSkipTilda, $bExtType);
76 }
77
78 switch (gettype($arData))
79 {
80 case "string":
81 if (preg_match("#['\"\\n\\r<\\\\\x80]#", $arData))
82 {
83 return "'" . CUtil::JSEscape($arData) . "'";
84 }
85 return "'" . $arData . "'";
86
87 case "array":
88 $i = -1;
89 $j = -1;
90 foreach ($arData as $j => $temp)
91 {
92 $i++;
93 if ($j !== $i)
94 {
95 break;
96 }
97 }
98
99 if ($j === $i)
100 {
101 $res = '[';
102 $first = true;
103 foreach ($arData as $value)
104 {
105 if ($first)
106 {
107 $first = false;
108 }
109 else
110 {
111 $res .= ',';
112 }
113
114 switch (gettype($value))
115 {
116 case "string":
117 if (preg_match("#['\"\\n\\r<\\\\\x80]#", $value))
118 {
119 $res .= "'" . CUtil::JSEscape($value) . "'";
120 }
121 else
122 {
123 $res .= "'" . $value . "'";
124 }
125 break;
126 case "array":
127 $res .= CUtil::PhpToJSObject($value, $bWS, $bSkipTilda, $bExtType);
128 break;
129 case "boolean":
130 if ($value === true)
131 {
132 $res .= 'true';
133 }
134 else
135 {
136 $res .= 'false';
137 }
138 break;
139 case "integer":
140 if ($bExtType)
141 {
142 $res .= $value;
143 }
144 else
145 {
146 $res .= "'" . $value . "'";
147 }
148 break;
149 case "double":
150 if ($bExtType)
151 {
152 $res .= is_finite($value) ? $value : "Infinity";
153 }
154 else
155 {
156 $res .= "'" . $value . "'";
157 }
158 break;
159 default:
160 if (preg_match("#['\"\\n\\r<\\\\\x80]#", (string)$value))
161 {
162 $res .= "'" . CUtil::JSEscape($value) . "'";
163 }
164 else
165 {
166 $res .= "'" . $value . "'";
167 }
168 break;
169 }
170 }
171 $res .= ']';
172 return $res;
173 }
174
175 $sWS = ',' . ($bWS ? "\n" : '');
176 $res = ($bWS ? "\n" : '') . '{';
177 $first = true;
178 foreach ($arData as $key => $value)
179 {
180 if ($bSkipTilda && str_starts_with($key, '~'))
181 {
182 continue;
183 }
184
185 if ($first)
186 {
187 $first = false;
188 }
189 else
190 {
191 $res .= $sWS;
192 }
193
194 if (preg_match("#['\"\\n\\r<\\\\\x80]#", $key))
195 {
196 $res .= "'" . CUtil::JSEscape($key) . "':";
197 }
198 else
199 {
200 $res .= "'" . $key . "':";
201 }
202
203 switch (gettype($value))
204 {
205 case "string":
206 if (preg_match("#['\"\\n\\r<\\\\\x80]#", $value))
207 {
208 $res .= "'" . CUtil::JSEscape($value) . "'";
209 }
210 else
211 {
212 $res .= "'" . $value . "'";
213 }
214 break;
215 case "array":
216 $res .= CUtil::PhpToJSObject($value, $bWS, $bSkipTilda, $bExtType);
217 break;
218 case "boolean":
219 if ($value === true)
220 {
221 $res .= 'true';
222 }
223 else
224 {
225 $res .= 'false';
226 }
227 break;
228 case "integer":
229 if ($bExtType)
230 {
231 $res .= $value;
232 }
233 else
234 {
235 $res .= "'" . $value . "'";
236 }
237 break;
238 case "double":
239 if ($bExtType)
240 {
241 $res .= is_finite($value) ? $value : "Infinity";
242 }
243 else
244 {
245 $res .= "'" . $value . "'";
246 }
247 break;
248 default:
249 if (preg_match("#['\"\\n\\r<\\\\\x80]#", (string)$value))
250 {
251 $res .= "'" . CUtil::JSEscape($value) . "'";
252 }
253 else
254 {
255 $res .= "'" . $value . "'";
256 }
257 break;
258 }
259 }
260 $res .= ($bWS ? "\n" : '') . '}';
261 return $res;
262
263 case "boolean":
264 if ($arData === true)
265 {
266 return 'true';
267 }
268 return 'false';
269
270 case "integer":
271 if ($bExtType)
272 {
273 return $arData;
274 }
275 return "'" . $arData . "'";
276
277 case "double":
278 if ($bExtType)
279 {
280 return is_finite($arData) ? $arData : "Infinity";
281 }
282 return "'" . $arData . "'";
283
284 default:
285 if (preg_match("#['\"\\n\\r<\\\\\x80]#", (string)$arData))
286 {
287 return "'" . CUtil::JSEscape($arData) . "'";
288 }
289 return "'" . $arData . "'";
290 }
291 }
292
293 public static function JsObjectToPhp($data, $bSkipNative = false)
294 {
295 $arResult = [];
296 $parse = $bSkipNative;
297
298 if (!$parse)
299 {
300 // json_decode recognize only UTF strings
301 // the name and value must be enclosed in double quotes
302 // single quotes are not valid
303 $arResult = json_decode($data, true);
304
305 if ($arResult === null)
306 {
307 $parse = true;
308 }
309 }
310
311 if ($parse)
312 {
313 if (!$bSkipNative)
314 {
315 // prevents warning recursion
316 trigger_error("CUtil::JsObjectToPhp() is deprecated. Probably, data is enclosed in single-quotes. Change it to double-quotes.", E_USER_WARNING);
317 }
318
319 $data = preg_replace('/[\s]*([{}\[\]\"])[\s]*/', '\1', $data);
320 $data = trim($data);
321
322 if (str_starts_with($data, '{')) // object
323 {
324 $arResult = [];
325
326 $depth = 0;
327 $end_pos = 0;
328 $arCommaPos = [];
329 $bStringStarted = false;
330 $prev_symbol = "";
331
332 $string_delimiter = '';
333 for ($i = 1, $len = mb_strlen($data); $i < $len; $i++)
334 {
335 $cur_symbol = mb_substr($data, $i, 1);
336 if ($cur_symbol == '"' || $cur_symbol == "'")
337 {
338 if (
339 $prev_symbol != '\\' && (
340 !$string_delimiter || $string_delimiter == $cur_symbol
341 )
342 )
343 {
344 if ($bStringStarted = !$bStringStarted)
345 {
346 $string_delimiter = $cur_symbol;
347 }
348 else
349 {
350 $string_delimiter = '';
351 }
352 }
353 }
354
355 elseif ($cur_symbol == '{' || $cur_symbol == '[')
356 {
357 $depth++;
358 }
359 elseif ($cur_symbol == ']')
360 {
361 $depth--;
362 }
363 elseif ($cur_symbol == '}')
364 {
365 if ($depth == 0)
366 {
367 $end_pos = $i;
368 break;
369 }
370 else
371 {
372 $depth--;
373 }
374 }
375 elseif ($cur_symbol == ',' && $depth == 0 && !$bStringStarted)
376 {
377 $arCommaPos[] = $i;
378 }
379 $prev_symbol = $cur_symbol;
380 }
381
382 if ($end_pos == 0)
383 {
384 return false;
385 }
386
387 $token = mb_substr($data, 1, $end_pos - 1);
388
389 $arTokens = [];
390 if (!empty($arCommaPos))
391 {
392 $prev_index = 0;
393 foreach ($arCommaPos as $pos)
394 {
395 $arTokens[] = mb_substr($token, $prev_index, $pos - $prev_index - 1);
396 $prev_index = $pos;
397 }
398 $arTokens[] = mb_substr($token, $prev_index);
399 }
400 else
401 {
402 $arTokens[] = $token;
403 }
404
405 foreach ($arTokens as $token)
406 {
407 $arTokenData = explode(":", $token, 2);
408
409 $q = mb_substr($arTokenData[0], 0, 1);
410 if ($q == '"')
411 {
412 $arTokenData[0] = mb_substr($arTokenData[0], 1, -1);
413 }
414 $arResult[CUtil::JsObjectToPhp($arTokenData[0], true)] = CUtil::JsObjectToPhp($arTokenData[1] ?? null, true);
415 }
416 }
417 elseif (str_starts_with($data, '[')) // array
418 {
419 $arResult = [];
420
421 $depth = 0;
422 $end_pos = 0;
423 $arCommaPos = [];
424 $bStringStarted = false;
425 $prev_symbol = "";
426 $string_delimiter = "";
427
428 for ($i = 1, $len = mb_strlen($data); $i < $len; $i++)
429 {
430 $cur_symbol = mb_substr($data, $i, 1);
431 if ($cur_symbol == '"' || $cur_symbol == "'")
432 {
433 if (
434 $prev_symbol != '\\' && (
435 !$string_delimiter || $string_delimiter == $cur_symbol
436 )
437 )
438 {
439 if ($bStringStarted = !$bStringStarted)
440 {
441 $string_delimiter = $cur_symbol;
442 }
443 else
444 {
445 $string_delimiter = '';
446 }
447 }
448 }
449 elseif ($cur_symbol == '{' || $cur_symbol == '[')
450 {
451 $depth++;
452 }
453 elseif ($cur_symbol == '}')
454 {
455 $depth--;
456 }
457 elseif ($cur_symbol == ']')
458 {
459 if ($depth == 0)
460 {
461 $end_pos = $i;
462 break;
463 }
464 else
465 {
466 $depth--;
467 }
468 }
469 elseif ($cur_symbol == ',' && $depth == 0 && !$bStringStarted)
470 {
471 $arCommaPos[] = $i;
472 }
473 $prev_symbol = $cur_symbol;
474 }
475
476 if ($end_pos == 0)
477 {
478 return false;
479 }
480
481 $token = mb_substr($data, 1, $end_pos - 1);
482
483 if (!empty($arCommaPos))
484 {
485 $prev_index = 0;
486 foreach ($arCommaPos as $pos)
487 {
488 $arResult[] = CUtil::JsObjectToPhp(mb_substr($token, $prev_index, $pos - $prev_index - 1), true);
489 $prev_index = $pos;
490 }
491 $r = CUtil::JsObjectToPhp(mb_substr($token, $prev_index), true);
492 if (isset($r))
493 {
494 $arResult[] = $r;
495 }
496 }
497 else
498 {
499 $r = CUtil::JsObjectToPhp($token, true);
500 if (isset($r))
501 {
502 $arResult[] = $r;
503 }
504 }
505 }
506 elseif ($data === "")
507 {
508 return null;
509 }
510 else // scalar
511 {
512 $q = mb_substr($data, 0, 1);
513 if ($q == '"' || $q == "'")
514 {
515 $data = mb_substr($data, 1, -1);
516 }
517
518 //\u0412\u0430\u0434\u0438\u043c
519 if (str_contains($data, '\u'))
520 {
521 $data = preg_replace_callback("/\\\u([0-9A-F]{2})([0-9A-F]{2})/i", ['CUtil', 'DecodeUtf16'], $data);
522 }
523
525 }
526 }
527
528 return $arResult;
529 }
530
531 public static function DecodeUtf16($ch)
532 {
533 $res = chr(hexdec($ch[2])) . chr(hexdec($ch[1]));
534 return Encoding::convertEncoding($res, 'UTF-16', 'UTF-8');
535 }
536
540 public static function JSPostUnescape()
541 {
542 }
543
547 public static function decodeURIComponent()
548 {
549 }
550
554 public static function DetectUTF8($string)
555 {
556 return Encoding::detectUtf8($string);
557 }
558
562 public static function ConvertToLangCharset($string)
563 {
564 return Encoding::convertToUtf($string);
565 }
566
567 public static function GetAdditionalFileURL($file, $bSkipCheck = false)
568 {
569 $filePath = $_SERVER['DOCUMENT_ROOT'] . $file;
570 if ($bSkipCheck || file_exists($filePath))
571 {
572 return $file . '?' . filemtime($filePath) . filesize($filePath);
573 }
574
575 return $file;
576 }
577
581 public static function InitJSCore($arExt = [], $bReturn = false)
582 {
583 /*patchvalidationapp2*/
584 return CJSCore::Init($arExt, $bReturn);
585 }
586
587 public static function GetPopupSize($resize_id, $arDefaults = [])
588 {
589 if ($resize_id)
590 {
591 return CUserOptions::GetOption(
592 'BX.WindowManager.9.5',
593 'size_' . $resize_id,
594 [
595 'width' => $arDefaults['width'] ?? null,
596 'height' => $arDefaults['height'] ?? null,
597 ]
598 );
599 }
600
601 return false;
602 }
603
604 public static function GetPopupOptions($wnd_id)
605 {
606 if ($wnd_id)
607 {
608 return CUserOptions::GetOption(
609 'BX.WindowManager.9.5',
610 'options_' . $wnd_id
611 );
612 }
613
614 return false;
615 }
616
617 public static function SetPopupOptions($wnd_id, $arOptions)
618 {
619 if ($wnd_id)
620 {
621 CUserOptions::SetOption(
622 'BX.WindowManager.9.5',
623 'options_' . $wnd_id,
625 );
626 }
627 }
628
629 public static function translit($str, $lang, $params = [])
630 {
631 static $search = [];
632
633 if (!isset($search[$lang]))
634 {
635 $mess = Loc::loadLanguageFile($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/js_core_translit.php", $lang, false);
636 $transFrom = explode(",", $mess["TRANS_FROM"]);
637 $transto = explode(",", $mess["TRANS_TO"]);
638 $search[$lang] = array_combine($transFrom, $transto);
639 }
640
641 $defaultParams = [
642 "max_len" => 100,
643 "change_case" => 'L', // 'L' - toLower, 'U' - toUpper, false - do not change
644 "replace_space" => '_',
645 "replace_other" => '_',
646 "delete_repeat_replace" => true,
647 "safe_chars" => '',
648 ];
649 foreach ($defaultParams as $key => $value)
650 {
651 if (!isset($params[$key]))
652 {
653 $params[$key] = $value;
654 }
655 }
656
657 $chars = mb_str_split($str);
658 $len = count($chars);
659 $strNew = '';
660 $lastChrNew = '';
661
662 for ($i = 0; $i < $len; $i++)
663 {
664 $chr = $chars[$i];
665
666 if (preg_match("/[a-zA-Z0-9]/", $chr) || ($params["safe_chars"] != '' && mb_strpos($params["safe_chars"], $chr) !== false))
667 {
668 $chrNew = $chr;
669 }
670 elseif (preg_match("/\\s/u", $chr))
671 {
672 if (
673 !$params["delete_repeat_replace"]
674 ||
675 ($i > 0 && $lastChrNew != $params["replace_space"])
676 )
677 {
678 $chrNew = $params["replace_space"];
679 }
680 else
681 {
682 $chrNew = '';
683 }
684 }
685 else
686 {
687 if (isset($search[$lang][$chr]))
688 {
689 $chrNew = $search[$lang][$chr];
690 }
691 else
692 {
693 if (
694 !$params["delete_repeat_replace"]
695 ||
696 ($i > 0 && $i != $len - 1 && $lastChrNew != $params["replace_other"])
697 )
698 {
699 $chrNew = $params["replace_other"];
700 }
701 else
702 {
703 $chrNew = '';
704 }
705 }
706 }
707
708 if ($chrNew != '')
709 {
710 $strNew .= $chrNew;
711 $lastChrNew = $chrNew;
712 }
713
714 if (mb_strlen($strNew) >= $params["max_len"])
715 {
716 break;
717 }
718 }
719
720 if ($params["change_case"] == "L" || $params["change_case"] == "l")
721 {
722 $strNew = mb_strtolower($strNew);
723 }
724 elseif ($params["change_case"] == "U" || $params["change_case"] == "u")
725 {
726 $strNew = mb_strtoupper($strNew);
727 }
728
729 return $strNew;
730 }
731
739 public static function Unformat($str)
740 {
741 return Config\Ini::unformatInt((string)$str);
742 }
743
744 public static function getSitesByWizard($wizard)
745 {
746 static $list = [];
747
748 if (!isset($list[$wizard]))
749 {
750 $list[$wizard] = [];
751
752 if ('portal' == $wizard && Main\ModuleManager::isModuleInstalled('bitrix24'))
753 {
754 $list[$wizard] = Main\SiteTable::getByPrimary('s1', ['cache' => ['ttl' => 86400]])->fetchAll();
755 }
756 else
757 {
758 if ($wizard <> '')
759 {
760 $res = Main\SiteTable::getList(['order' => ['DEF' => 'DESC', 'SORT' => 'ASC']]);
761 foreach ($res as $item)
762 {
763 if (Main\Config\Option::get('main', '~wizard_id', '', $item['LID']) === $wizard)
764 {
765 $list[$wizard][] = $item;
766 }
767 }
768 }
769 }
770 }
771
772 return $list[$wizard];
773 }
774}
if(isset( $_REQUEST["mode"]) &&$_REQUEST["mode"]=="ajax") if(isset($_REQUEST["mode"]) && $_REQUEST["mode"]=="save_lru" &&check_bitrix_sessid()) $first
Определения access_dialog.php:54
$arResult
Определения generate_coupon.php:16
static get($moduleId, $name, $default="", $siteId=false)
Определения option.php:30
static isModuleInstalled($moduleName)
Определения modulemanager.php:125
static getList(array $parameters=array())
Определения datamanager.php:431
static getByPrimary($primary, array $parameters=array())
Определения datamanager.php:330
static Init($arExt=array(), $bReturn=false)
Определения jscore.php:66
Определения util.php:9
static InitJSCore($arExt=[], $bReturn=false)
Определения util.php:581
static closetags($html)
Определения util.php:17
static translit($str, $lang, $params=[])
Определения util.php:629
static DetectUTF8($string)
Определения util.php:554
static decodeURIComponent()
Определения util.php:547
static JSEscape($s)
Определения util.php:48
static addslashes($s)
Определения util.php:10
static ConvertToLangCharset($string)
Определения util.php:562
static GetPopupSize($resize_id, $arDefaults=[])
Определения util.php:587
static JsObjectToPhp($data, $bSkipNative=false)
Определения util.php:293
static DecodeUtf16($ch)
Определения util.php:531
static GetAdditionalFileURL($file, $bSkipCheck=false)
Определения util.php:567
static getSitesByWizard($wizard)
Определения util.php:744
static GetPopupOptions($wnd_id)
Определения util.php:604
static JSPostUnescape()
Определения util.php:540
static JSUrlEscape($s)
Определения util.php:56
static SetPopupOptions($wnd_id, $arOptions)
Определения util.php:617
static Unformat($str)
Определения util.php:739
static PhpToJSObject($arData, $bWS=false, $bSkipTilda=false, $bExtType=false)
Определения util.php:66
$str
Определения commerceml2.php:63
$data['IS_AVAILABLE']
Определения .description.php:13
$res
Определения filter_act.php:7
$result
Определения get_property_values.php:14
else $ch
Определения group_list_element_edit.php:27
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
if(!defined('SITE_ID')) $lang
Определения include.php:91
$arOptions
Определения structure.php:223
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if(empty($signedUserToken)) $key
Определения quickway.php:257
$i
Определения factura.php:643
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$val
Определения options.php:1793