ขั้นตอนที่ 1: วิธี PHP ในการสกัดกั้นสตริงภาษาจีน
เนื่องจากอักขระที่อ่านไม่ออก (ใช้ substr) มักจะปรากฏขึ้นเมื่อสกัดกั้นสตริงภาษาจีนบนหน้าแรกของเว็บไซต์และ vTigerCRM วันนี้ฉันพบวิธีที่ดีกว่าในการสกัดกั้นสตริงภาษาจีน และต้องการแบ่งปันกับคุณ .
ฟังก์ชั่น msubstr($str, $start, $len) {
$tmpstr = "";
$strlen = $start + $len;
สำหรับ($i = 0; $i < $strlen; $i++) {
ถ้า(อ๊อด(substr($str, $i, 1)) > 0xa0) {
$tmpstr .= substr($str, $i, 2);
$i++;
} อื่น
$tmpstr .= substr($str, $i, 1);
-
กลับ $tmpstr;
}
โปรแกรม 2: PHP สกัดกั้นสตริง UTF-8 และแก้ไขปัญหาครึ่งอักขระ
/********************************* **** *********************************
* PHP สกัดกั้นสตริง UTF-8 เพื่อแก้ไขปัญหาครึ่งอักขระ
* ภาษาอังกฤษ และตัวเลข (ครึ่งความกว้าง) คือ 1 ไบต์ (8 บิต), จีน (เต็มความกว้าง) คือ 3 ไบต์
* @return สตริงที่ถูกนำออก เมื่อ $len น้อยกว่าหรือเท่ากับ 0 สตริงทั้งหมดจะถูกส่งคืน
* @param $str สตริงต้นทาง
* $len คือความยาวของสตริงย่อยทางด้านซ้าย
************************************************** * ******************/
ฟังก์ชั่น utf_substr($str,$len)
-
สำหรับ($i=0;$i<$เลน;$i++)
-
$temp_str=substr($str,0,1);
ถ้า(อ๊อด($temp_str) > 127)
-
$i++;
ถ้า($i<$เลน)
-
$new_str[]=substr($str,0,3);
$str=substr($str,3);
-
-
อื่น
-
$new_str[]=substr($str,0,1);
$str=substr($str,1);
-
-
กลับเข้าร่วม($new_str);
-
?>
การสกัดกั้นสตริง php utf-8
<?
ฟังก์ชั่น cutstr($string, $length) {
preg_match_all("/[x01-x7f]|[xc2-xdf][x80-xbf]|xe0[xa0-xbf][x80-xbf]|[xe1-xef ][x80-xbf][x80-xbf]|xf0[x90-xbf][x80-xbf][x80-xbf]|[xf1-xf7][x80 -xbf][x80-xbf][x80-xbf]/", $string, $info);
สำหรับ($i=0; $i<count($info[0]); $i++) {
$wordscut .= $info[0][$i];
$j = ord($info[0][$i]) > 127 ? $j + 2 : $j + 1;
ถ้า ($j > $length - 3) {
กลับ $wordscut" ";
-
-
กลับเข้าร่วม('', $info[0]);
-
$string="242432 ฝ่ายค้านคือ 456 มุ่งมั่นในสถานทูตท้องถิ่น 7890";
สำหรับ($i=0;$i<strlen($string);$i++)
-
echo cutstr($string,$i)"<br>";
-
-
ฟังก์ชันสกัดกั้นสตริง UTF-8
เพื่อรองรับหลายภาษา สตริงในฐานข้อมูลอาจถูกบันทึกเป็นการเข้ารหัส UTF-8 ในการพัฒนาเว็บไซต์ คุณอาจจำเป็นต้องใช้ PHP เพื่อสกัดกั้นส่วนหนึ่งของสตริง เพื่อหลีกเลี่ยงอักขระที่อ่านไม่ออก ให้เขียนฟังก์ชันการสกัดกั้นสตริง UTF-8 ต่อไปนี้
สำหรับหลักการของ UTF-8 โปรดดูคำถามที่พบบ่อยของ UTF-
8 อักขระที่เข้ารหัสอาจประกอบด้วย 1~3 ไบต์ กำหนดโดยคนแรกที่ตัดสินโดยไบต์ (ตามทฤษฎีแล้วอาจนานกว่านั้น แต่ที่นี่เราถือว่าไม่เกิน 3 ไบต์)
หากไบต์แรกมากกว่า 224 ไบต์แรกและ 2 ไบต์หลังจากนั้นจะรวมกันเป็นอักขระ UTF-8 อักขระ มิฉะนั้น ไบต์แรกจะเป็นอักขระภาษาอังกฤษ (รวมถึงตัวเลขและเครื่องหมายวรรคตอนเล็กน้อย)
โค้ดที่ออกแบบมาสำหรับเว็บไซต์ก่อนหน้านี้ (รวมถึงฟังก์ชันการสกัดกั้นความยาวที่ใช้ในหน้าแรกด้วย)
รหัส:
<?php // Cut_Str;
//$sourcestr เป็นสตริงที่จะประมวลผล
//$cutlength คือความยาวของการสกัดกั้น (เช่น จำนวนคำ)
ฟังก์ชั่น cut_str($sourcestr,$cutlength)
-
$returnstr='';
$i=0;
$n=0;
$str_length=strlen($sourcestr);//จำนวนไบต์ในสตริง
ในขณะที่ (($n<$cutlength) และ ($i<=$str_length))
-
$temp_str=substr($sourcestr,$i,1);
$ascnum=Ord($temp_str);//รับโค้ด ascii ของอักขระ $i-th ในสตริง
if ($ascnum>=224) //หากบิต ASCII สูงและ 224
-
$returnstr=$returnstr.substr($sourcestr,$i,3); //ตามข้อกำหนดการเข้ารหัส UTF-8 อักขระ 3 ตัวที่ต่อเนื่องกันจะถูกนับเป็นอักขระตัวเดียว
$i=$i+3; //ไบต์จริงนับเป็น 3
$n++; //ความยาวของสตริงนับเป็น 1
-
elseif ($ascnum>=192) //ถ้าบิต ASCII สูงและ 192
-
$returnstr=$returnstr.substr($sourcestr,$i,2); //ตามข้อกำหนดการเข้ารหัส UTF-8 อักขระ 2 ตัวที่ต่อเนื่องกันจะถูกนับเป็นอักขระตัวเดียว
$i=$i+2; //ไบต์จริงนับเป็น 2
$n++; //ความยาวของสตริงนับเป็น 1
-
elseif ($ascnum>=65 && $ascnum<=90) //ถ้าเป็นตัวพิมพ์ใหญ่
-
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; //จำนวนไบต์ที่แท้จริงยังคงนับเป็น 1
$n++; //แต่เมื่อพิจารณาจากลักษณะโดยรวมแล้ว ตัวอักษรตัวพิมพ์ใหญ่จะนับเป็นอักขระที่มีบิตสูงหนึ่งตัว
-
else //ในกรณีอื่นๆ ให้รวมตัวอักษรพิมพ์เล็กและเครื่องหมายวรรคตอนแบบครึ่งความกว้าง
-
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; //จำนวนไบต์ที่แท้จริงคือ 1
$n=$n+0.5; //ตัวอักษรตัวพิมพ์เล็กและเครื่องหมายวรรคตอนครึ่งความกว้างคือครึ่งหนึ่งของความกว้างของอักขระลำดับสูง...
-
-
ถ้า ($str_length>$ความยาวตัด){
$returnstr = $returnstr . "...";//เพิ่มจุดไข่ปลาที่ส่วนท้ายเมื่อความยาวเกิน
-
return $returnstr;
}
ฟังก์ชันฟังก์ชันสตริงสกัดกั้น utf-8
FSubstr($title,$start,$len="",$magic=true)
-
-
* ขับเคลื่อนโดย Smartpig
* อีเมลถึง:[email protected]
*/
if($len == "") $len=strlen($title);
ถ้า($เริ่มต้น != 0)
-
$startv = ord(substr($title,$start,1));
ถ้า($startv >= 128)
-
ถ้า($startv < 192)
-
สำหรับ($i=$start-1;$i>0;$i--)
-
$tempv = ord(substr($ชื่อ,$i,1));
if($tempv >= 192) พัง;
-
$เริ่มต้น = $i;
-
-
-
if(strlen($title)<=$len) return substr($title,$start,$len);
$อเลน = 0;
$เบลน = 0;
$เรียลนัม = 0;
สำหรับ($i=$start;$i<strlen($title);$i++)
-
$cประเภท = 0;
$ซีสเต็ป = 0;
$cur = substr($หัวข้อ,$i,1);
ถ้า($cur == "&")
-
if(substr($title,$i,4) == "<")
-
$ซีสเต็ป = 4;
$ ความยาว += 4;
$i += 3;
$realnum++;
ถ้า($เวทย์มนตร์)
-
$อัลเลน++;
-
-
อย่างอื่นถ้า(substr($title,$i,4) == ">")
-
$ซีสเต็ป = 4;
$ ความยาว += 4;
$i += 3;
$realnum++;
ถ้า($เวทย์มนตร์)
-
$อัลเลน++;
-
-
อย่างอื่นถ้า(substr($title,$i,5) == "&")
-
$cสเต็ป = 5;
$ความยาว += 5;
$i += 4;
$realnum++;
ถ้า($เวทย์มนตร์)
-
$อัลเลน++;
-
-
อย่างอื่นถ้า(substr($title,$i,6) == """)
-
$ซีสเต็ป = 6;
$ ความยาว += 6;
$i += 5;
$realnum++;
ถ้า($เวทย์มนตร์)
-
$อัลเลน++;
-
-
อย่างอื่น if(preg_match("/&#(d+);?/i",substr($title,$i,8),$match))
-
$cstep = strlen($match[0]);
$length += strlen($match[0]);
$i += strlen($match[0])-1;
$realnum++;
ถ้า($เวทย์มนตร์)
-
$เบลน++;
$cประเภท = 1;
-
-
}อื่น{
ถ้า(อ๊อด($cur)>=252)
-
$ซีสเต็ป = 6;
$ ความยาว += 6;
$i += 5;
$realnum++;
ถ้า($เวทย์มนตร์)
-
$เบลน++;
$cประเภท = 1;
-
}elseif(อ๊อด($cur)>=248){
$cสเต็ป = 5;
$ความยาว += 5;
$i += 4;
$realnum++;
ถ้า($เวทย์มนตร์)
-
$cประเภท = 1;
$เบลน++;
-
}elseif(อ๊อด($cur)>=240){
$ซีสเต็ป = 4;
$ ความยาว += 4;
$i += 3;
$realnum++;
ถ้า($เวทย์มนตร์)
-
$เบลน++;
$cประเภท = 1;
-
}elseif(อ๊อด($cur)>=224){
$ซีสเต็ป = 3;
$ความยาว += 3;
$i += 2;
$realnum++;
ถ้า($เวทย์มนตร์)
-
$cประเภท = 1;
$เบลน++;
-
}elseif(อ๊อด($cur)>=192){
$ซีสเต็ป = 2;
$ความยาว += 2;
$i += 1;
$realnum++;
ถ้า($เวทย์มนตร์)
-
$เบลน++;
$cประเภท = 1;
-
}elseif(อ๊อด($cur)>=128){
$ความยาว += 1;
}อื่น{
$cสเต็ป = 1;
$ความยาว +=1;
$realnum++;
ถ้า($เวทย์มนตร์)
-
ถ้า(อ๊อด($cur) >= 65 && อ๊อด($cur) <= 90)
-
$เบลน++;
}อื่น{
$อัลเลน++;
-
-
-
-
ถ้า($เวทย์มนตร์)
-
if(($blen*2+$alen) == ($len*2)) พัง;
ถ้า(($blen*2+$alen) == ($len*2+1))
-
ถ้า($ctype == 1)
-
$ความยาว -= $cstep;
หยุดพัก;
}อื่น{
หยุดพัก;
-
-
}อื่น{
if($realnum == $len) พัง;
-
-
ไม่ได้ตั้งค่า($cur);
ไม่ได้ตั้งค่า($อัลเลน);
ไม่ได้ตั้งค่า($เบลน);
ไม่ได้ตั้งค่า($realnum);
ไม่ได้ตั้งค่า($ctype);
ไม่ได้ตั้งค่า($cstep);
return substr($title,$start,$length);
-