Leroy Lita's 15th goal of the season ended Preston's long unbeaten league run and took the Royals to within touching distance of the Premiership.
Substitute Lita lit up a scrappy game to seal all three points for Reading, Preston's first league defeat in 23 matches.
Both sides came into the game on the back of rare defeats, Preston having lost 2-0 at home to Middlesbrough in the FA Cup while Reading's 33-match unbeaten league run was ended at Luton.
Preston so nearly made a dream start as Brett Ormerod played David Nugent in in the opening minute, but the striker's first touch let him down and gave Reading keeper Marcus Hahnemann the chance to save at his feet.
Instead it was Reading who took an early lead as Steve Sidwell bundled in his ninth goal of the season.
Bobby Convey's corner was chested away by Tyrone Mears but straight into the path of Ivar Ingimarsson. His left-foot shot looked like an easy take for Preston keeper Carlo Nash, but he fumbled the ball under pressure from Sidwell, who gratefully stabbed home from a yard out.
But Preston were level two minutes later after some equally generous goalkeeping.
Hahnemann allowed a ball to run behind, not realising one of his defenders had got the final touch, and from the resulting corner Ibrahima Sonko needlessly shoved Youl Mawene on the edge of the box.
That gave Callum Davidson the chance to bend a free-kick round the Reading wall and beyond the reach of Hahnemann, the first league goal Reading have conceded at home since January 2.
But the thrilling opening exchanges gave way to a scrappy first half, which threatened to boil over seven minutes before half-time when Nash clashed with Reading striker Dave Kitson.
Nash had raced from his penalty area to clear after Kitson was sent free of the Preston defence and the pair collided after Kitson had won the race.
The keeper escaped unpunished, while Kitson was helped off after appearing to be knocked out.
But Preston's relief at seeing the departure of Reading's top scorer was short-lived as his replacement, Lita, took just five minutes to fire the home side back in front.
Kevin Doyle played a perfectly weighted through ball and Lita was on to it in a flash before beating Nash with a low drive into the far corner.
Preston rarely threatened another equaliser, though Doyle sliced a corner just wide of his own goal and Davidson's diving header forced Graeme Murty to hack away even though the effort looked like drifting wide.
And sub Danny Dichio missed a glorious chance to level in the final minute when he nodded wide from Mears' inviting cross.
Reading had earlier been denied the chance to avoid such a frantic finish when Claude Davis appeared to tug back Doyle in the penalty area, only for referee Keith Stroud to wave away the home side's appeals.