South Africa closed in on a series-clinching win over Sri Lanka after taking 12 wickets on a one-sided third day of the decisive third Test in Cape Town.

Sri Lanka collapsed from 149 for two overnight to 239 all out and, following on, were 138 for four at the close, still 203 runs behind.

Vernon Philander and Dale Steyn took three first-innings wickets apiece as South Africa seized control of the match early on. And the second innings of Tillakaratne Dilshan, Kumar Sangakkara and Mahela Jayawardene were all ended before stumps to leave their side facing a huge task to save the match and the series.

Philander had Dilshan caught behind by Mark Boucher for five and Jacques Kallis removed Lahiru Thirimanne for 30, Hashim Amla taking the catch off bat and pad at short leg. Kallis also took two catches to get rid of Sangakkara (34) and Jayawardene (12), with Imran Tahir and Morne Morkel the bowlers.

In the opening session of the day Steyn had put the hosts on the front foot as Sri Lanka lost five first-innings wickets for 70. Steyn had Sangakkara (35) caught by Amla at gully before Sri Lanka could add a run to their overnight 149.

Samaraweera edged a Philander delivery to Kallis at second slip for 11 and Jayawardene (30) did just the same to hand Steyn his second victim. Steyn struck again to have Mathews (one) caught behind by Boucher before Tahir bowled Thisara Perera for five.

Philander helped wrap up the tail by dismissing Rangana Herath for one and Dhammika Prasad for nine before Morkel ended Lokuge Chandimal's resistance for 35.