South African bowlers put a clinical performance to restrict England to 193-7 after the batsmen lifted the side to a healthy 196-5.
Wayne Parnell claimed 3-31 to hurt England's chase while Imran Tahir finished with 2-27, giving him a handy support. Parnell, replacing Lowanbo Tsotsobe, brought back the side in contention, having dismissed Michael Lumb (18) who with Alex Hales, gave England a rapid start in its bid to chase a big total.
Hales, who made a brilliant century to help England win a match against Sri Lanka earlier from a similar condition, scored at fluent pace. Parnell returned with a bang to dismiss Hales and Moeen Ali (10) in consecutive deliveries to halt England's march. Hales struck six fours and one six in his 38 off 22.
Tahir had taken out threatening Eoin Morgan (14) and Jos Buttler to take South Africa closer. Ravi Bopara (31) kept England's hope running but Dale Steyn in the first ball of the last over removed him when England needed 22.
Tim Bresnan along with Broad had taken 18 off the over with the former scoring 17 off 4. But still they fell short of four runs to win the game. The defeat all but confirmed England's exit from the tournament.
Dale Steyn and Beuran Hendricks grabbed one wicket apiece for South Africa. Earlier, AB de Villiers smashed 69 not out to help South Africa amass a massive total.
De Villiers hit three sixes and nine fours off 28 balls to accelerate the innings at the death with 68 runs in the last four overs.
Hashim Amla scored 56 off 37, hitting two sixes and six fours, while Quinton de Kock made 29. Amla and Kock had got the South Africans off to a solid start, adding 90 runs. De Villiers and David Miller were particularly harsh on Jade Dernbach, taking him for 26 in his third over in which de Villiers struck two sixes.
James Tredwell, Tim Bresnan, Chris Jordan and Stuart Broad claimed one wicket apiece for England