2014-08-28 68 views

回答

2
$numberAsString = trim($string, '@#') 

在這種情況下可能是最簡單和最快的。在這種情況下,輸出仍然是一個字符串,但在大多數情況下,這並不重要。如果它在你的情況下,你可以使用(int),(float)或類似的來獲得它的正確類型。

當然,正則表達式也將是可能的,例如:

$didMatch = preg_match('/@+([^#]+)#+/', $string, $matches); 

另一種可能性仍然首先在初始2 @後提取剩餘的部分,然後澆鑄到一個數字,這似乎是總是INT IN這種情況下:

$number = (int)substr($string, 2); 

還有另一種可能性是由字符個數去,只需使用SUBSTR,如:

$numberAsString = substr($string, 2, -2); 

或者你也可以勇於創新,使用像爆炸+破滅+陣列功能:

$numberAsString = array_slice(explode('#', implode('', array_slice(explode('@', $string), 2))), 0, -2); 

當然,這最後一個純粹是爲了表明它可以通過各種方式來完成,因爲它是非常低效和不切實際,但肯定有其他幾十種方式。

如果你在緊密的循環或性能真正重要的地方使用它,我會基準不同的可能性 - 在猜測中,我會說修剪或純子串解決方案將是最快的。

+0

如果任何其他字符出現在字符串中,將會中斷 – 2014-08-28 08:11:40

+0

是的,但答案仍然適合所有給出的示例。順便說一句。你的preg_match解決方案也會「打破」,如果他還想提取一個浮點數,我們不知道這個浮點數是否在給定的問題中,所以它真的歸結爲這種情況下的可用數據;) – griffin 2014-08-28 08:13:49

1
$str = "@@563##"; 
preg_match("|\d+|", $str, $res); 
print_r($res); 
0

只要撥打filter_var()函數,它將返回唯一的數字。

無論輸入是什麼,它只會爲您過濾數字!

filter_var("@@120058##", FILTER_SANITIZE_NUMBER_INT) // return 120058 
    filter_var("*##20kkk", FILTER_SANITIZE_NUMBER_INT) // return 20