2012-11-14 109 views
0

關於刪除前導和尾隨0有很多問題,但是我找不到除尾部0(除0之外的其他任何地方除外結束)。從字符串中刪除除尾0之外的所有0

100010 -> 110 
010200 -> 1200 
01110 -> 1110 

有什麼建議嗎?

+2

您可以使用regexp來做到這一點。 – Aziz

+0

轉換爲整數然後返回字符串? – bendataclear

+1

@bendataclear不,他想在中間刪除0。 – emartel

回答

5

嘗試

echo preg_replace('/0+([1-9])/', '$1', $str); 
-1

不是最漂亮的,但它的工作原理...

$str = "01110"; 

if(substr($str,-1) == 0){ 
    $str = str_replace("0","",$str)."0"; 
}else{ 
    $str = str_replace("0","",$str); 
} 

echo $str; // gives '1110' 
+0

啊這隻適用於如果它是一個尾隨零。 Woops。 – Chris

2

您可以使用正則表達式[0]+(?=[1-9])找到零(使用正向前查找)和preg_replace用一個空字符串替換它們(假設的數量已經是以字符串形式)。

$result = preg_replace("#[0]+(?=[1-9])#", "", "100010"); 

看到它在行動here

0

您可以使用正則表達式做你想要什麼:

if(preg_match('/^(0*)(.*?)(0*)$/',$string,$match)) { 
    $string = $match[1] . str_replace('0','',$match[2]) . $match[3]; 
} 
1

要替換是不是所有的零在字符串的末尾。

你可以做到這一點與所謂的負先行有點正則表達式,所以只有零匹配更換是不是在字符串的結尾:

$actual = preg_replace('/0+(?!$|0)/', '', $subject); 

$象徵字符串結尾。 0+表示一個或多個零。這是貪婪的,也就是說,如果有兩個,它會花兩個,而不是一個。這是非常重要的,不要在最後取代。但也需要寫出,不允許0代替正在被替換的內容。

挺想你制定你的句子:

的方式來刪除除尾0(0領先或除結尾以外的任何其他地方)全部爲0。

即:0+(?!$|0)。見http://www.regular-expressions.info/lookaround.html - Demo

的另一變化是與atomic grouping,這應該是一點點向前伸直(Demo):

(?>0+)(?!$) 
+2

測試用例失敗:'010200 - > 1200'。 – nickb

+0

@nickb:第一個答案我有點快,編輯了一下。 – hakre

0

您可以使用正則表達式爲其他人則建議,或修剪。計算結尾0,去掉所有0,然後將尾部0加回去。

$num = 10100; 
$trailing_cnt = strlen($num)-strlen(trim($num, "0")); 
$num = str_replace('0','',$num).str_repeat('0', $trailing_cnt); 
0
// original string 
$string = '100010'; 

// remember trailing zeros, if any 
$trailing_zeros = ''; 
if (preg_match('/(0+)$/', $string, $matches)) { 
    $trailing_zeros = $matches[1]; 
} 

// remove all zeros 
$string = str_replace('0', '', $string); 
// add trailing ones back, if they were found before 
$string .= $trailing_zeros; 
0

這裏是一個解決方案。那裏應該更漂亮一點,但那也適用。

$subject = "010200"; 
$match = array(); 
preg_match("/0*$/",$subject,$match); 
echo preg_replace("/0*/","",$subject).$match[0]; 
相關問題