Goalkeeper Unai Simon was the hero as Spain edged past 10-man Switzerland 3-1 on penalties on Friday to set up a Euro 2020 semi-final against either Belgium or Italy.
After a 1-1 draw in Saint Petersburg which saw the Swiss play for 43 minutes a man down, Simon made two saves in the shoot-out to help keep Spain’s bid for a record fourth European crown alive.
It was heartbreak for Switzerland, who were bidding for reach the semi-finals of a major tournament for the first time in their history.
Spain forged ahead early on when Denis Zakaria put through his own net, but Switzerland were the better side for long periods and Xherdan Shaqiri, standing in for the suspended Granit Xhaka as captain, equalised in the 68th minute.
The Swiss were reduced to 10 men with 13 minutes remaining, though, when midfielder Remo Freuler was controversially dismissed for a tackle on Gerard Moreno.
Switzerland goalkeeper Yann Sommer, the hero of the penalty shoot-out win over world champions France in the last 16, made a string of fine saves in extra time.
But Simon saved from Fabian Schaer and Manuel Akanji, while Ruben Vargas blazed over in a tense finale as Spain snuck through, with Mikel Oyarzabal smashing home the winning spot-kick.
Luis Enrique’s men will take on either Belgium or Italy, who meet in Munich later Friday, at Wembley on Tuesday.
After scoring 10 goals in their previous two matches, this was a return to the type of profligate performances which saw Spain draw their first two group games against Sweden and Poland.
But the 2008 and 2012 winners had made a dream start to this quarter-final, taking the lead in fortunate circumstances in only the eighth minute.
A corner was cleared only as far as Jordi Alba, whose left-footed volley was diverted past Sommer by Switzerland midfielder Zakaria, only playing in place of Xhaka.
It was the 10th own goal of Euro 2020, more than the other 15 editions combined.
Alvaro Morata wasted an excellent opportunity by heading too close to Sommer when unmarked, but then Switzerland started to grow into the game.
Silvan Widmer headed off target from a corner, before Steven Zuber thought he had won a penalty only to be flagged offside.
Spain coach Luis Enrique sent on Dani Olmo for Pablo Sarabia at half-time and the RB Leipzig man threatened inside 60 seconds, seeing his low volley well held by Sommer.
Zakaria came agonisingly close to making up for his earlier own goal when his header span narrowly wide.
Switzerland had an even better chance for a leveller in the 64th minute, as Shaqiri sparked a quick counter-attack which ended with Spain goalkeeper Unai Simon reacting well to keep out Zuber’s stabbed effort at his near post.
But the underdogs found the equaliser they deserved four minutes later, as Freuler latched onto a loose ball after a mix-up in the Spanish defence and squared for Shaqiri to slot into the far corner and score his third goal of the tournament.
The pattern of the game changed in the 77th minute though, when referee Michael Oliver gave Freuler his marching orders for a sliding challenge on Spanish substitute Moreno.
Switzerland managed to keep Spain at bay until the end of normal time with relative ease, but in the third minute of the additional half an hour Moreno should have put Spain back in front, only to miskick Alba’s cross wide from close range.
Switzerland were perhaps lucky not to have another man sent off shortly afterwards, when Widmer escaped a second yellow card for a cynical foul on Olmo.
Moreno somehow passed up another golden opportunity, denied at point-blank range by Sommer, before the Borussia Moenchengladbach stopper made an excellent diving save from Oyarzabal.
Agence France-Presse