[精讚] [會員登入]
1069

[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] CodeIgniter 3+pure+smarty安裝及環境設置1/2 PHP framework CodeIgniter 3+ pure CSS +smarty Template Engine的整合

[PHP] 命名空間 namespace及 use PHP >=5.3 開始支援命名空間:namespace

[PHP] CodeIgniter 3+pure+smarty安裝及環境設置2/2 PHP framework CodeIgniter 3+ pure CSS +smarty Template Engine的整合#2

[PHP] 取得檔名和路徑:basename, dirname 由絕對路徑取的路徑及檔名的方法

[PHP] 檢查檔案是否是圖檔 使用getimagesize函數檢查檔案是否是圖檔

[PHP] 移除檔案的UTF8 BOM 移除檔案的UTF8 BOM

隨機好文

[MAC] 截取螢幕畫面的方法 截取螢幕畫面的方法,在MAC中叫作螢幕快照,英文是screenshot

[jQuery] 利用load()來達成ajax的寫法 jQuery中利用load()來達成ajax的寫法,也有人稱他是假的ajax,作法就是..

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

看懂DSUB DVI HDMI USB等各式影音接頭 看懂DSUB DVI HDMI等各式影音接頭

TFTP Server 安裝及使用 讓設備的網路設定檔或是韌體經由TFTP拷備出來,操作的方法