[討論] substr 有長度限制?

看板PHP作者 (K.T)時間13年前 (2012/09/10 16:59), 編輯推噓0(0033)
留言33則, 4人參與, 最新討論串1/1
我在官網沒看到,但是我測試時有遇到這種狀況 參考字串如 $var1='{'json':'xxxxx',{xx..x.x... etc (長度超過 10000) }}'; $var2=1211; $var3=0; 上面是連在一起的,是從檔案撈出來的東西 我的目標是把他parse成 $var_arr['var1']='{}'; $var_arr['var2']=1211; $var_arr['var3']=0; 這樣的格式 code 如下 do { $var = strpos($str,"$",$var); if($var) { $equal = strpos($str,"=",$var); if($equal) { /* 有等號 */ $end = strpos($str,";",$equal); $new_var_key = substr($str,$var+1,$equal-$var-1); $new_var_val = substr($str,$equal+1,$end-$equal-1); $new_var[$new_var_key]=trim($new_var_val,"'"); $var = $end; } else { break; } } else { break; } } while($var); 但是字串長度很長的那個的結果是錯誤的 後面兩個的結果是正確的 因此是不是 substr 有長度的限制? 還是我的程式有寫錯呢? -- [There's no undo in your life]                          ●~   ●~ ●~   ●~ ●~   ●~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.34.30.6 ※ 編輯: kerash 來自: 114.34.30.6 (09/10 17:00)

09/10 17:54, , 1F
var1內容就含";"符號..就會出現你的錯誤..
09/10 17:54, 1F

09/10 17:56, , 2F
如果有錯的話後面兩個應該不會正確,但是後面是正確的,只
09/10 17:56, 2F

09/10 17:57, , 3F
有被取回來的長度錯誤,所以我才想是不是length有限制
09/10 17:57, 3F
目前是先改用把遠端抓回來的資料寫成檔案再重新 include 但是這樣後續會變成要寫一堆檔案,因此想找出原因 ※ 編輯: kerash 來自: 114.34.30.6 (09/10 17:58)

09/10 17:57, , 4F
考慮一下改用eval或serialize/json_encode等方式處理那資料
09/10 17:57, 4F
我的第一筆檔案就是 json_encode 過的 這份檔案算是紀錄檔,但為了方便該主機使用,所以寫成 PHP 格式 <?php $var1='{}'; $var2=xxx; var3=0; ?> 沒辦法直接把這份檔案另存成 json , 因為會牽涉到其他約七個站台 目前要做的是一個管理機制所以才從遠端撈回資料 ※ 編輯: kerash 來自: 114.34.30.6 (09/10 18:00)

09/10 18:13, , 5F
第一個回覆..你必須親自測試一下..有定見會讓你看不到真像.
09/10 18:13, 5F

09/10 18:16, , 6F
第二個回覆沒有限制編幾次幾維陣列..
09/10 18:16, 6F

09/10 18:16, , 7F
重點是不用在寫parser...
09/10 18:16, 7F

09/10 20:46, , 8F
能詳述嗎? 我只能確認沒有那些會失敗的符號,只是不確定切
09/10 20:46, 8F

09/10 20:47, , 9F
的長度為何。過程中確實是只切應有的次數(我有把位置echo)
09/10 20:47, 9F

09/10 20:47, , 10F
第一筆資料長度大約是 39 萬字元。
09/10 20:47, 10F

09/10 20:47, , 11F
另外不用寫在parser的意思是?
09/10 20:47, 11F

09/10 21:07, , 12F
直接include不就好了 @@
09/10 21:07, 12F

09/10 21:46, , 13F
機器不同台,我目前是用寫檔後include沒錯
09/10 21:46, 13F

09/10 22:46, , 14F
你寫的規則是~找第一個$字號再來找第一個=號..
09/10 22:46, 14F

09/10 22:47, , 15F
再來找第一個;號...如果這之間有兩個;號..就會你這個問題..
09/10 22:47, 15F

09/10 22:50, , 16F
不用寫parser的意思~你不用特意寫解析程式~來解析你這個檔.
09/10 22:50, 16F

09/10 22:52, , 17F
有字串轉PHP變數...PHP變數轉字串的函示可以用..
09/10 22:52, 17F

09/10 23:21, , 18F
你指的是eval的話,因為第一筆資料是使用者可輸入的資料
09/10 23:21, 18F

09/10 23:22, , 19F
所以不好直接轉,才會採取用自訂parse,至於分號我會注意
09/10 23:22, 19F

09/10 23:41, , 20F
請用 regex..
09/10 23:41, 20F

09/10 23:45, , 21F
regex 確定有長度限制,要修改php.ini才行,我不一定有權限
09/10 23:45, 21F

09/10 23:45, , 22F
所以暫時不考慮
09/10 23:45, 22F

09/11 00:07, , 23F
關 php 啥事... js regex 可三行解決..
09/11 00:07, 23F

09/11 00:08, , 24F
= =我在PHP板不問PHP嗎? 我全都是後端執行跟前端無關啊
09/11 00:08, 24F

09/11 00:18, , 25F
對不起,看錯
09/11 00:18, 25F

09/11 00:19, , 26F
js確實有substr啦 囧"...
09/11 00:19, 26F

09/11 00:20, , 27F
如果檔案有幾十MB,你可以改用自動機的方式去parse
09/11 00:20, 27F

09/11 00:22, , 28F
檔案最多控制在1MB而已,所以想說執行能快越好,只是不想產
09/11 00:22, 28F

09/11 00:23, , 29F
生太多的檔案而已,目前固定會產生一筆了
09/11 00:23, 29F

09/11 00:24, , 30F
我說的自動機是 finite state machine,原理跟 regex 很像
09/11 00:24, 30F

09/11 00:25, , 31F
finite state 有畫好,基本上就不會 parse 錯,速度夠快了..
09/11 00:25, 31F

09/11 00:28, , 32F
沒有特別研究過,不確定適不適合,因為我需求其實很簡單..
09/11 00:28, 32F

09/11 00:28, , 33F
關於自動機我再看看好了
09/11 00:28, 33F
文章代碼(AID): #1GJQlyul (PHP)
文章代碼(AID): #1GJQlyul (PHP)