Ravi Bopara and Jonathan Trott scored half centuries to save England from total humiliation after captain Andrew Strauss' decision to bat backfired spectacularly when Peterson dismissed both openers in the first over.
Peterson also removed Ian Bell with a full-length diving catch off his own bowling for a spell of three wickets for three runs in 16 balls.
Trott eked his way to 52 in a 99-run, fourth-wicket stand with Bopara, who justified his selection ahead of Paul Collingwood with 60 at Chennai's Chidambaram Stadium.
But Tahir took 4-38, Peterson a career-best 3-22 and paceman Morne Morkel 2-16 to leave England's bowling attack defending a lowly total. England must also contend with other problems.
Kevin Pietersen needs hernia surgery after the tournament and appeared to be in obvious discomfort as he scored just 2 from three deliveries before becoming Peterson's second victim.
The success of Peterson and Tahir suggested England's Graeme Swann and Michael Yardy could enjoy bowling on a difficult, crumbling pitch. But mid-innings joy for Morkel and Dale Steyn leaves Strauss with a tricky decision about how to open the innings.
AB de Villiers has also struck a century in each of South Africa's matches so far, so South Africa looks well-placed for just a second win in the last nine completed one-day internationals against England.
Strauss chose to bat despite England having looked better chasing a total rather than defending. He holed out to De Villiers at deep midwicket without scoring and Pietersen was caught at slip by Jacques Kallis.
Peterson, whose previous one-day best was 3-42, then took a return catch off Bell's forward prod to leave England reeling at 15-3.
Things almost got a lot worse with the first ball of the 15th over when Trott was adjudged lbw to Imran Tahir, but the batsman's appeal for review showed the delivery was spinning a little too much and would have just missed the off stump and he got the reprieve.
That maiden over left England on just 51-3 after the first two powerplays, but Smith's decision to keep the dangerous Peterson back for a later spell lifted some of the pressure as Trott and Bopara slowly rebuilt the innings to something approaching respectability.
Bopara survived a run out on 27 after being sent back by Trott, diving to make his ground just before Morne van Wyk - keeping wicket because of De Villiers' back problems - broke the stumps.
Trott successfully referred an lbw appeal when he was on 20 and was spilled on 51 when Steyn took a full-length catch off Tahir but couldn't hold on to it as he landed on elbows. Still, Trott fell just three balls later, caught and bowled by Tahir.
Prior edged Morkel to Van Wyk for 10 and Bopara equaled his one-day best score, set against India in Kanpur in 2008, before his 98-ball innings ended lbw to Morkel. Tim Bresnan went lbw to Steyn, Tahir had Michael Yardy caught by Peterson, Broad fell lbw to Tahir and Swann was caught off Tahir as England's last six wickets fell for 37 runs.
Proteas spinners dominate as England slump to 171
Advertisement