[精讚] [會員登入]
1043

[PHP] 字串拆解函數substr 奇異的錯誤(札記)

偶然發現一個 substr函數拆解上的怪異之處

分享此文連結 //n.sfs.tw/13218

分享連結 [PHP] 字串拆解函數substr 奇異的錯誤(札記)@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2019-10-25 11:20:58 最後編修
2019-04-05 14:49:49 By 張○○
 

自動目錄

今天在寫程式時,使用 substr的一個簡單的想法,但是結果卻出乎我的意料,為此還花了十多分鐘查錯和半小時打這篇文章

substr在切字串時很有用,例如官網例[1]:

$rest = substr("abcdef", -1);    // "f"
$rest = substr("abcdef", -2);    // "ef"
$rest = substr("abcdef", -3, 1); // "d"

 

今天我的想法是,如果我字串最後面是數字的話,我就怎樣怎樣…

$roma="0123456";

$last=substr($roma, -1,1); //6
if( $last>='0' and $last<='9'){
  怎樣怎樣...
}

因為這個數字我把他視為字串,所以這樣的判斷沒有問題。

但是,

後來發現程式執行結果不正確,我一直找不出原因,後來發現,如果我傳入的$roma是空字串或是null,結果竟然會怎樣怎樣

太讓我吃驚了。(PHP 5.5)

$roma=null;

$last=substr($roma, -1,1); //空的,什麼都沒印
if( $last>='0' and $last<='9'){
  怎樣怎樣...竟然被執行了,你也可以試試
}

在上面的判斷中,怎樣怎樣竟然被執行了。上面的 'and'換成 '&&',或是 '0','9'換成數字 0,9結果都一樣。

我試著判斷

$last='';
if( $last >= '0' && $last <='9'){ 怎樣怎樣... }

$last=null;
if( $last >= '0' && $last <='9'){ 怎樣怎樣... }

都不會成功,但是substr切出來的就會成功。

這太神奇了!解決方法請看結論。

結論

substr 遇到空字串或null,切出來的不知道是什麼?留給有興趣的人去研究。

這個BUG到了php>7.0以後就被修正。

使用mb_substr取代 substr得到的結果就是正確的。

程式隨時會有意想不到的BUG,在估時間的時候要留多一點時間。

 

參考資料

[1] https://www.php.net/manual/en/function.substr.php

 

 

 

 

 

END

你可能感興趣的文章

[PHP] 陣列排序 sort, ksort, asort, usort... 簡單的記錄PHP的陣列排序,因為常常會用到。

[PHP] 讀取作業系統程式執行結果 PHP讀取作業系統程式執行結果

[phpmyadmin] 設定預設語言(Language) phpmyadmin預設進來是會選擇你瀏覽器預設的語系,改成正體中文

[PHP] 類別的繼承及建構子和解構子 PHP 類別的繼承及建構子和解構子

[PHP] 移除陣列或字串中的重覆元素 移除陣列或字串中的重覆元素

[PHP] 字串拆解函數substr 奇異的錯誤(札記) 偶然發現一個 substr函數拆解上的怪異之處

隨機好文

[jQuery] textarea 的取值和給值 HTML 的 TEXTAREA 標籤若要用 jquery 取值,不能使用 .text() 或 .html() ,使用 .

Linux shell 的date表示法 linux下SHELL中的date表示法

詭異的創業思維 創業的思維中,有多少銀彈,有多少技術,有多少人脈,有多少時間等等,每個都要考慮進去,以熱忱建立的關係脆弱的像蘇打餅乾一樣..

[AS3] FLASH 引入外部as檔 FLASH AS3中,若要引用另外撰寫的 class(*.as) 檔案,該如何處理?

在Centos7 下安裝 Wildfly10 wildfly以前叫JBoss,2014.11.20改名叫Wildfly,起始版本是Wildfly8,現在已經出到Wil