有沒有更好的方法搜尋「字串」

edited 十月 2013 in PHP新手區
PHP4 裡好像沒有能搜尋字串的函數
網路上有找到個strripos,不過只支援PHP4
所以只好自己寫個笨函示
速度超慢,不知大大有沒有更好的方法?

function str_find($str_target,$str_find,$pos_start){

for($i=$pos_start;$i<strlen($str_target)-strlen($str_find)+1;$i++){
$str_sub=big5_substr($str_target,$i,strlen($str_find));
if($str_sub==$str_find){
return $i;
}
}
return false;
}

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=870

評論

  • edited 九月 2005
    nickcat 寫道:
    PHP4 裡好像沒有能搜尋字串的函數
    網路上有找到個strripos,不過只支援PHP4
    所以只好自己寫個笨函示
    速度超慢,不知大大有沒有更好的方法?

    function str_find($str_target,$str_find,$pos_start){

    for($i=$pos_start;$i<strlen($str_target)-strlen($str_find)+1;$i++){
    $str_sub=big5_substr($str_target,$i,strlen($str_find));
    if($str_sub==$str_find){
    return $i;
    }
    }
    return false;
    }

    這邊我提出我的想法

    假設
    $str 是原始字串
    $pos 是指定要找的字串

    $pieces = explode($pos, $str);
    sizeof($pieces) - 1 可以得知有幾個$pos在$str中
    而strlen($pieces[0])可以判讀出第一個找到的$pos是從第幾字元開始
    第二個以後,就要考慮較多的事情,不過也沒很複雜,這邊就不寫出來了

    當然,詳細程式內容還是需要修改,我只是提個思考方向而已
  • edited 九月 2005
    大大,您真有如一座燈塔一般,指引迷途的我們一條光明大道!(好噁)
    感謝你的提點,這方法果然快!
    在看到你的留言之前,自己又試了一個蠢方法,還是超慢的
    可是用你的方法,原本要跑107秒,現在1秒不到就有結果了!
    感謝感謝!

    蠢function big5_find2($str_target,$str_find,$pos_start){
    $len_find=big5_strlen($str_find);
    for($i_arr=0;$i_arr<$len_find;$i_arr++){
    $arr_find[$i_arr]=big5_substr($str_find,$i_arr,1);
    }

    $pos1=$pos_start;
    do{
    $pos1=big5_strpos($str_target,$arr_find[0],$pos1);
    $pos2=$pos1;
    if(is_numeric($pos1)==false){
    return false;
    }else{
    for($i=1;$i<$i_arr;$i++){
    $chr=big5_substr($str_target,$pos1+$i,1);
    if($chr!=$arr_find[$i]){
    $i=$i_arr;
    $pos1=$pos1+1;
    }
    if($i==($i_arr-1)){
    return $pos2;
    }
    }
    }

    }while(true);
    }

    讚function big5_find3($str_target,$str_find,$pos_start){
    $pieces=explode($str_find,$str_target);
    $i_explode=sizeof($pieces);
    if($i_explode==1){
    return false;
    }
    $i_pos=0;
    for($i=0;$i<$i_explode;$i++){
    $i_pos=$i_pos+big5_strlen($pieces[$i]);
    if($i_pos>$pos_start or $i_pos==$pos_start){
    return $i_pos;
    }
    $i_pos=$i_pos+big5_strlen($str_target);

    }
    return false;



    }
Sign In or Register to comment.