專業設計師團隊,賦予空間新美感
裝潢設計搭配量身訂做系統家具
壁紙跳蚤防治專業團隊服務,消滅跳蚤蟲卵蛹
徹底消滅跳蚤,免費諮詢服務

首頁  •  j2h 論壇 • 程式設計討論     • 

[php] 切割字串

房東:阿凱
發表時間:2012-02-03


preg_split -- 正規表達式切割字串

說明:

array preg_split ( string pattern, string subject [, int limit [, int flags]])



注: 在4版beta3中 加入選項



尋找相符字串進行字串切割.如果指定次數,他則只會切割指定次數後中止,另外您也可以使用選項進行其他設定.



以下為可使用的選項 :



PREG_SPLIT_NO_EMPTY

只傳回不為空值的項目



PREG_SPLIT_DELIM_CAPTURE

parenthesized expression in the delimiter pattern will be captured and returned as well. This flag was added for 4.0.5.



PREG_SPLIT_OFFSET_CAPTURE



取得相符合的字串位置,此函數將切割為二維陣列,

其中二維的第一個值為字串,第二個值是切割點的位置.

. 此選項發行於 PHP 4.3.0 中.


 










<?php

// split the phrase by any number of commas or space characters,

// which include " ", \r, \t, \n and \f

$keywords = preg_split ("/[\s,]+/", "hypertext language, programming");

?>













<?php

$str = 'string';

$chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);

print_r($chars);

?>













<?php

$str = 'hypertext language programming';

$chars = preg_split('/ /', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);

print_r($chars);

?>



will yield










Array

(

[0] => Array

(

[0] => hypertext

[1] => 0

)



[1] => Array

(

[0] => language

[1] => 10

)



[2] => Array

(

[0] => programming

[1] => 19

)



)




http://www.php5.idv.tw/modules.php?mod=books&act=show&shid=711




  • 贊助網站       

    廣利不動產-板橋在地生根最實在--新板特區指名度最高、值得您信賴的好房仲
    完整房訊,房屋、店面熱門精選物件,廣利不動產 優質仲介,房屋租賃、買賣資訊透明,交易真安心!
    廣利不動產-新板特區指名度最高、值得您信賴的好房仲
    您的托付,廣利用心為您服務

  • 1 樓住戶:小彭
    發表時間:2012-02-05

    php提供 explode() 可以將自串利用特定字元切割,並存入陣列中...

    用法:

    $pizza = "piece1 piece2 piece3 piece4 piece5 piece6";
    $pieces = explode(" ", $pizza);
    echo $pieces[0]; // piece1
    echo $pieces[1]; // piece2

    上面這一段是將$pizza中的字串利用空白字元" "下去做分隔。存入$pieces陣列中。

    $即將被存入的陣列變數 = explode("分隔符號",要被切割的字串);


    2 樓住戶:阿瑄
    發表時間:2012-02-05


    PHP中的substr是以位元組來切割字串,如:

    $content = "這是 bruse 的測試";
    echo substr($content,0,15)."
    ";



    在UTF-8的編碼下,因為中文字為3位元組,第15位元組是中文字三位元組中央,所以會印出:

    這是 bruse 皼br>



    其中可以看到"的"的前二位元組會把
    的"<"拿去組字,造成中文字和程式碼的錯誤。

    有一種方法可以解決這個問題,就是使用mb_substr,並帶編碼,如:

    $content = "這是 bruse 的測試";
    echo mb_substr($content,0,15,"UTF-8");

    使用mb_substr可以設定編碼,中文字會被判斷是1個字,因為content只有13字,所以15個中英文會全部印出:

    這是 bruse 的測試


    這樣是解決了切中文字的問題沒錯,但有時我們要把資料存進資料庫或是呈現出來,這時15個中文字並非是15個位元組,會造成程式的錯誤。

    所以,我們必須改寫substr,使用位元組的方式計算長度,但又不能出現中文字切割的錯誤,我們改寫substr為utf8_substr,程式如下:

    function utf8_substr($StrInput,$strStart,$strLen)
    {

    //對字串做URL Eecode
    $StrInput = mb_substr($StrInput,$strStart,mb_strlen($StrInput));
    $iString = urlencode($StrInput);
    $lstrResult="";
    $istrLen = 0;
    $k = 0;
    do{

    $lstrChar = substr($iString, $k, 1);
    if($lstrChar == "%"){
    $ThisChr = hexdec(substr($iString, $k+1, 2));
    if($ThisChr >= 128){
    if($istrLen+3 < $strLen){
    $lstrResult .= urldecode(substr($iString, $k, 9));
    $k = $k + 9;
    $istrLen+=3;
    }else{
    $k = $k + 9;
    $istrLen+=3;
    }
    }else{
    $lstrResult .= urldecode(substr($iString, $k, 3));
    $k = $k + 3;
    $istrLen+=2;
    }
    }else{
    $lstrResult .= urldecode(substr($iString, $k, 1));
    $k = $k + 1;
    $istrLen++;
    }

    }while

    ($k < strlen($iString) && $istrLen < $strLen);

    return $lstrResult;

    }

    $content = "這是 bruse 的測試";
    echo utf8_substr($content,0,15);

    上面的程式碼如果遇到切在中文字中,就會跳出,所以會印出:

    這是 bruse

    這樣就解決了以上的問題,不過呈現時若使用strlen判斷長度再切,因為中文在UTF-8中是三個位元組,而英文是一個位元組,但中文和英文的字寬度並不到三倍,大約只有一倍,所以會變成長度差太多,此時,我們就得連strlen也改寫,這個以後再介紹。




     共 2 人回應  選擇頁數 【第1 頁】 

    姓名:
    佈告內容:
    其他選項: