因為需要辨識中文字串中是否有一些關鍵字
所以使用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;
}
本 著作 係採用創用 CC 姓名標示-非商業性-禁止改作 3.0 台灣 授權條款授權.