/[LeafOK_CVS]/fenglin/lib/str_process.inc.php
ViewVC logotype

Annotation of /fenglin/lib/str_process.inc.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.24 - (hide annotations)
Fri Oct 31 10:31:55 2025 UTC (4 months, 2 weeks ago) by sysadm
Branch: MAIN
CVS Tags: HEAD
Changes since 1.23: +4 -4 lines
Refine

1 sysadm 1.16 <?php
2 sysadm 1.23 function str_length(string $str, bool $skip_ctrl_seq = false) : int
3 sysadm 1.12 {
4     $len = strlen($str);
5     $ret = 0;
6    
7     for ($i = 0; $i < $len; $i++)
8     {
9     $c = $str[$i];
10    
11 sysadm 1.23 if ($c == "\r" || $c == "\7") // skip
12     {
13     continue;
14     }
15    
16 sysadm 1.24 if ($skip_ctrl_seq && $c == "\033" && $i + 1 < $len && $str[$i + 1] == "[") // Skip control sequence
17 sysadm 1.23 {
18     for ($i = $i + 2;
19 sysadm 1.24 $i < $len && (ctype_digit($str[$i]) || $str[$i] == ';' || $str[$i] == '?');
20 sysadm 1.23 $i++)
21     ;
22    
23 sysadm 1.24 if ($i < $len && $str[$i] == 'm') // valid
24 sysadm 1.23 {
25     // skip
26     }
27 sysadm 1.24 else if ($i < $len && ctype_alpha($str[$i]))
28 sysadm 1.23 {
29     // unsupported ANSI CSI command
30     }
31     else
32     {
33     $i--;
34     }
35    
36     continue;
37     }
38    
39 sysadm 1.12 // Process UTF-8 Chinese characters
40     $v1 = ord($c);
41 sysadm 1.21 if ($v1 & 0x80) //head of multi-byte character
42 sysadm 1.12 {
43 sysadm 1.21 $v2 = ($v1 & 0x70) << 1;
44     while ($v2 & 0x80)
45 sysadm 1.12 {
46     $i++;
47 sysadm 1.20 $c .= $str[$i];
48 sysadm 1.21 $v2 = ($v2 & 0x7f) << 1;
49 sysadm 1.12 }
50    
51     $ret += 2;
52     }
53     else
54     {
55     $ret++;
56     }
57     }
58    
59     return $ret;
60     }
61    
62 sysadm 1.22 function split_line(string $str, string $prefix = "", int $width = PHP_INT_MAX, int $lines_limit = PHP_INT_MAX, string $end_of_line = "\n") : string
63 sysadm 1.1 {
64 sysadm 1.10 if ($width <= 0)
65 sysadm 1.14 {
66 sysadm 1.22 $width = PHP_INT_MAX;
67 sysadm 1.14 }
68 sysadm 1.17
69 sysadm 1.9 $result = "";
70 sysadm 1.10 $len = strlen($str);
71 sysadm 1.12 $prefix_len = str_length($prefix);
72 sysadm 1.10
73     $lines_count = 0;
74 sysadm 1.9
75 sysadm 1.4 $line = $prefix;
76 sysadm 1.9 $line_len = $prefix_len;
77 sysadm 1.11 for ($i = 0; $i < $len && $lines_count < $lines_limit; $i++)
78 sysadm 1.1 {
79 sysadm 1.10 $c = $str[$i];
80 sysadm 1.9
81 sysadm 1.10 // Skip special characters
82     if ($c == "\r" || $c == "\7")
83     {
84     continue;
85     }
86 sysadm 1.17
87 sysadm 1.10 if ($c == "\n")
88     {
89 sysadm 1.13 if ($lines_count + 1 >= $lines_limit)
90     {
91     break;
92     }
93    
94     $result .= ($line . $end_of_line);
95 sysadm 1.10 $lines_count++;
96     $line = $prefix;
97     $line_len = $prefix_len;
98     continue;
99     }
100    
101     // Process UTF-8 Chinese characters
102     $v1 = ord($c);
103 sysadm 1.21 if ($v1 & 0x80) //head of multi-byte character
104 sysadm 1.10 {
105 sysadm 1.21 $v2 = ($v1 & 0x70) << 1;
106     while ($v2 & 0x80)
107 sysadm 1.10 {
108     $i++;
109 sysadm 1.20 $c .= $str[$i];
110 sysadm 1.21 $v2 = ($v2 & 0x7f) << 1;
111 sysadm 1.10 }
112    
113     // Each UTF-8 CJK character should use two character length for display
114     if ($line_len + 2 > $width)
115     {
116 sysadm 1.12 if ($lines_count + 1 >= $lines_limit)
117     {
118     break;
119     }
120    
121 sysadm 1.13 $result .= ($line . $end_of_line);
122 sysadm 1.10 $lines_count++;
123     $line = $prefix;
124     $line_len = $prefix_len;
125     }
126     $line_len += 2;
127     }
128     else
129     {
130     $line_len++;
131     }
132    
133 sysadm 1.15 if ($line_len > $width)
134 sysadm 1.3 {
135 sysadm 1.12 if ($lines_count + 1 >= $lines_limit)
136     {
137     break;
138     }
139    
140 sysadm 1.13 $result .= ($line . $end_of_line);
141 sysadm 1.10 $lines_count++;
142 sysadm 1.4 $line = $prefix;
143 sysadm 1.15 $line_len = $prefix_len + 1;
144 sysadm 1.3 }
145 sysadm 1.15
146     $line .= $c;
147 sysadm 1.1 }
148 sysadm 1.11
149     if ($lines_count < $lines_limit)
150     {
151     $result .= $line;
152     }
153 sysadm 1.1
154     return $result;
155     }

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1