Spain needed to survive an anxious penalty shootout to finally see off a Yann Sommer-inspired Switzerland, who played over 40 minutes with 10 men, and book their place in the Euro 2020 semi-finals.
Jordi Alba gave them a half-time lead in Saint Petersburg, with his volley from the edge of the area skewing past Sommer with the aid of a huge deflection from Denis Zakaria, who was ultimately credited with the own goal.
The Swiss were much improved in the second half and got the goal they deserved following a huge mix-up between Aymeric Laporte and Pau Torres at the back, allowing the ball to be quickly squared across the box by Remo Freuler for Xherdan Shaqiri to tuck away the equaliser.
But their task was made much harder when Freluer was shown a straight red card for a challenge which seemed very unfair on the Atalanta star.
In extra-time, the game belonged to Sommer, who turned in an
exceptional performance to deny Spain time after time, although he was helped a little by Gerard Moreno’s misfiring, having shot wide with the goal gaping to ensure it went to penalties.
After winning in a shootout in the previous round, Switzerland couldn't repeat the feat as defenders Fabian Schär and Manuel Akanji were denied by Unai Simón before Ruben Vargas blasted over, setting La Roja up for a 3-1 win from the spot.
Switzerland would have fancied their chances to score a winner in normal time but their momentum was crushed when they were reduced to 10-men.
Remo Freuler controversially received his marching orders after he felled Gerard Moreno.
It was a strong challenge but a red card could be considered harsh.
The 2008 and 2012 winners will now take on the winners of Italy and Belgium in Wembley on Tuesday.