因為需要辨識中文字串中是否有一些關鍵字
所以使用mb_strpos這個函式
但是卻都沒有作用...
明明小範圍測式是OK的
但是放到迴圈裡面就爆了
都給我RETURN FALSE
於是就去網路上找一下
發現這個函式還真是問題多多

雖然學資訊常常都是站在巨人的肩膀上
但是這次我得自己架梯子了(不敢說自己是巨人XD)
先去找到了把Multi-Byte字串切割成char array的函式
就開始著手寫替代mb_strpos的函式

我命名為mb_str_exist($str,$ex_str)
前者是被搜尋的字串(A),後者是要搜尋的字串(B)
原理是先把兩個字串變成char array
在A陣列中搜尋B陣列的第1個字元
找不到就RETURN FALSE
找到以後,紀錄位置
從下一個位置搜尋B的第2個字元
找到就繼續下一個位置搜B的第3個
因為字串式連貫的
任何一個找不到就RETURN FALSE
這個方法應該還不會太浪費效能
畢竟也就線性而已

底下PO出CODE:

function mb_str_exist($str,$ex_str)
//尋找父字串中是否存在子字串,若有則回傳位置,前者為父字串,後者為子字串
{
 $str_arr = mb_str_split($str);
 $ex_str_arr = mb_str_split($ex_str);
 $first_pos = 0;//存取第一個字元的位置
 $have_one = false;//用以判斷第一個字元自否存在,若存在,再接下去搜尋剩下的
 for($i=0;$i<count($ex_str_arr);$i++)
 {
  if($i == 0)
  {
   for($j=$first_pos;$j<count($str_arr);$j++)
   {
    if($str_arr[$j] == $ex_str_arr[0])
    {
     $first_pos = $j;
     $have_one = true;
     break;
    }
   }
   if($have_one == false)
   {return false;}
  }
  else if($i !== 0 and $have_one == true)
  {
   if($str_arr[$j+1] == $ex_str_arr[$i])
   {
    $j++;
   }
   else
   {return false;}
  }
  else
  {return false;}
 }
 return $first_pos;
}

function mb_str_split($str, $length = 1)
//Let string to char array

 if ($length < 1) return FALSE;
 $result = array();
 for ($i = 0; $i < mb_strlen($str); $i += $length)
 {
  $result[] = mb_substr($str, $i, $length);
 }
 return $result;
}

Creative Commons License
本 著作 係採用創用 CC 姓名標示-非商業性-禁止改作 3.0 台灣 授權條款授權.

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 LB.Yu 的頭像
    LB.Yu

    冷言冷語

    LB.Yu 發表在 痞客邦 留言(1) 人氣()