2012-06-10 244 views
2

我有問題,SUBSTR函數的$長度SUBSTR返回空字符串

我的代碼

$string='I love stackoverflow.com'; 
function arabicSubStr($value,$start,$length=false){ 
    return mb_substr($value,$start,$length,'UTF-8'); 
} 

echo arabicSubStr($string,7);//outputs nothing 
echo substr($string,7);//outputs stackoverflow.com 

問題的原因是:

如果給出了length並且爲0, FALSE或NULL將返回一個空字符串。

那麼,我該如何解決這個問題?

我不會用strlen($string)

EDITE

我知道的原因是因爲我定義$長度爲假

,我在這裏認識了我穿什麼應該在$長度參數來避免這個錯誤?

我試圖把-1它既然你得到一個空字符串的原因是你的問題的內容指定完全返回//stackoverflow.co

回答

3

(使用0,FALSE或NULL ),我假設你只是想要一種方法來獲取字符串的其餘部分。

在這種情況下,我會使用類似:

function arabicSubStr ($value, $start, $length = -1) { 
    if ($length == -1) 
     $length = mb_strlen ($value, 'UTF-8') - $start; 
    return mb_substr ($value, $start, $length, 'UTF-8'); 
} 

你需要做這種方式由於存在表示「字符串的其餘部分」長度的無標記值。正數(和零)將限制給定的大小,負數將剝離字符串的末尾(如您在問題編輯中所示)。

如果你真的不想使用一個字符串長度的功能,你可以嘗試 9999的值(甚至更高),並希望:

  • mb_substr()功能將只使用它作爲的最大值的值;和
  • 你不會傳遞任何字符串10K或更多。

換句話說,沿着線的東西:

function arabicSubStr ($value, $start, $length = 9999){ 
    return mb_substr ($value, $start, $length, 'UTF-8'); 
} 

但是請記住,我沒有測試過,我沒有任何的PHP環境在我的當前位置。

+1

我們都是對的,錯誤發生的原因是我已經將$ length定義爲false,並且我來到這裏知道如何忽略$ length parametre並且跨越到下一個,並且我雖然說過我不會使用strlen ,最後我認爲唯一的方法是使用strlen,感謝您的回答 –

+0

@Alaa,給9999選項一個去,它可能工作。我沒有測試過它,但由於doco狀態長度是從字符串中提取的_maximum_長度,所以您可能會感到驚喜。 – paxdiablo

+0

我認爲strlen好得多,非常感謝 –

0

這是因爲你有$length設置爲false作爲你的函數的默認參數,這有效意味着你想它返回一個0長度的子串。

不幸的是,如果你有設置我想象你做的最後一個參數(字符集),那麼你必須先計算該字符串的長度,所以像:

function arabicSubStr($value,$start,$length=false){ 
    $length = ($length) ? $length : mb_strlen($value,'UTF-8') - $start; 
    return mb_substr($value,$start,$length,'UTF-8'); 
} 
+2

doco(http://www.php.net/manual/en/function.substr.php)似乎另有說明。 '-1'去掉最後一個字符。 – paxdiablo

+0

'-1'*不是* $ length的默認值。 –

+0

哦,廢話。那就對了。我討厭那個。我總是期望它能以其他方式工作。 '-1'返回起點之前的所有內容。啞。將更新。 – Anthony