الإجراء 1: طريقة PHP لاعتراض السلاسل الصينية.
نظرًا لأن الأحرف المشوهة (باستخدام substr) تظهر غالبًا عند اعتراض السلاسل الصينية على الصفحة الرئيسية لموقع الويب وvTigerCRM، فقد وجدت اليوم طريقة أفضل لاعتراض السلاسل الصينية وأرغب في مشاركتها معك. .
الدالة msubstr($str, $start, $len) {
$tmpstr = "";
$strlen = $start + $len;
for($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<$len;$i++)
{
$temp_str=substr($str,0,1);
إذا (أورد($temp_str) > 127)
{
$i++;
إذا($i<$len)
{
$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
<?
وظيفة قطع(سلسلة $، طول $) {
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)؛
for($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، فإنه والبايتتين التاليتين له يشكلان حرف UTF-8. الحرف بخلاف ذلك، فإن البايت الأول نفسه هو حرف إنجليزي (بما في ذلك الأرقام وكمية صغيرة من علامات الترقيم).
رمز تم تصميمه مسبقًا لموقع ويب (أيضًا وظيفة اعتراض الطول المستخدمة حاليًا على الصفحة الرئيسية)
شفرة:
<?php // Cut_Str;
//$sourcestr هي السلسلة المراد معالجتها
//$cutlength هو طول الاعتراض (أي عدد الكلمات)
الدالة Cut_str($sourcestr,$cutlength)
{
$returnstr='';
$i=0;
$ن=0;
$str_length=strlen($sourcestr);// عدد البايتات في السلسلة
بينما (($n<$cutlength) و ($i<=$str_length))
{
$temp_str=substr($sourcestr,$i,1);
$ascnum=Ord($temp_str);// احصل على رمز ascii للحرف $i-th في السلسلة
إذا ($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، يتم حساب حرفين متتاليين كحرف واحد
$i=$i+2; // يتم حساب البايت الفعلي على أنه 2
$n++; // طول السلسلة يساوي 1
}
elseif ($ascnum>=65 && $ascnum<=90) //إذا كان حرفًا كبيرًا،
{
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; // لا يزال العدد الفعلي للبايتات يساوي 1
$n++; // ولكن بالنظر إلى المظهر العام، يتم احتساب الأحرف الكبيرة كحرف واحد عالي البت
}
آخر // في حالات أخرى، قم بتضمين أحرف صغيرة وعلامات ترقيم نصف العرض،
{
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; // عدد البايت الفعلي هو 1
$n=$n+0.5; // الأحرف الصغيرة وعلامات الترقيم نصف العرض هي نصف عرض الأحرف عالية الترتيب...
}
}
إذا ($str_length>$cutlength){
$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($title,$i,1));
إذا($tempv >= 192) استراحة؛
}
$بداية = $i;
}
}
}
if(strlen($title)<=$len) return substr($title,$start,$len);
$ألين = 0;
$ بلين = 0;
$الرقم الحقيقي = 0;
for($i=$start;$i<strlen($title);$i++)
{
$ctype = 0;
$cstep = 0;
$cur = substr($title,$i,1);
إذا($cur == "&")
{
إذا (substr($title,$i,4) == "<")
{
$cstep = 4;
$طول += 4;
$i += 3;
$realnum++;
إذا($السحر)
{
$ألين++;
}
}
وإلا إذا (substr($title,$i,4) == ">")
{
$cstep = 4;
$طول += 4;
$i += 3;
$realnum++;
إذا($السحر)
{
$ألين++;
}
}
وإلا إذا (substr($title,$i,5) == "&")
{
$cstep = 5;
$طول += 5;
$i += 4;
$realnum++;
إذا($السحر)
{
$ألين++;
}
}
وإلا إذا (substr($title,$i,6) == """)
{
$cstep = 6;
$طول += 6;
$i += 5;
$realnum++;
إذا($السحر)
{
$ألين++;
}
}
وإلا إذا (preg_match("/&#(d+);?/i",substr($title,$i,8),$match))
{
$cstep = strlen($match[0]);
$length += strlen($match[0]);
$i += strlen($match[0])-1;
$realnum++;
إذا($السحر)
{
$ بلين++;
$ctype = 1;
}
}
}آخر{
إذا (أورد($cur)>=252)
{
$cstep = 6;
$طول += 6;
$i += 5;
$realnum++;
إذا($السحر)
{
$ بلين++;
$ctype = 1;
}
}elseif(أورد($cur)>=248){
$cstep = 5;
$طول += 5;
$i += 4;
$realnum++;
إذا($السحر)
{
$ctype = 1;
$ بلين++;
}
}elseif(أورد($cur)>=240){
$cstep = 4;
$طول += 4;
$i += 3;
$realnum++;
إذا($السحر)
{
$ بلين++;
$ctype = 1;
}
}elseif(أورد($cur)>=224){
$cstep = 3;
$طول += 3;
$i += 2;
$realnum++;
إذا($السحر)
{
$ctype = 1;
$ بلين++;
}
}elseif(أورد($cur)>=192){
$cstep = 2;
$طول += 2;
$i += 1;
$realnum++;
إذا($السحر)
{
$ بلين++;
$ctype = 1;
}
}elseif(أورد($cur)>=128){
$طول += 1;
}آخر{
$cstep = 1;
$طول +=1;
$realnum++;
إذا($السحر)
{
إذا (أورد($cur) >= 65 && أورد($cur) <= 90)
{
$ بلين++;
}آخر{
$ألين++;
}
}
}
}
إذا($السحر)
{
if(($blen*2+$alen) == ($len*2)) استراحة؛
إذا (($blen*2+$alen) == ($len*2+1))
{
إذا($ctype == 1)
{
$length -= $cstep;
استراحة؛
}آخر{
استراحة؛
}
}
}آخر{
إذا($realnum == $len) استراحة؛
}
}
غير محدد($cur);
غير محدد($ألين);
غير محدد($بلين);
غير محدد($realnum);
غير محدد($ctype);
غير محدد($cstep);
إرجاع substr($title,$start,$length);
}