The Phillies, who have won 13 of 17 games, are 2½ games behind the Braves in the NL East.
Halladay (16-8) won his sixth straight while allowing eight hits, striking out five and walking three, matching a season high. It was the ninth time this season he hasn't allowed a run and the 25th time in 26 starts he has pitched six or more innings.
The Phillies, who managed just four hits, scored their lone run off Jason Marquis (0-6) in the third inning on Raul Ibanez's RBI double.
Washington had its chances against Halladay, who worked out of jams in the first, third, fourth and seventh innings. In the first, a double and a pair of walks loaded the bases before Roger Bernadina grounded into a double play.
After getting out of one-out, two-on situations in the third and fourth, a single by Ian Desmond and a walk to Adam Dunn put runners on first and second with one out in the seventh. But Halladay escaped when Ryan Zimmerman lined into a double play.
Zimmerman hit the ball hard to left field and Desmond was attempting to steal third on the play, but after a good throw by Ibanez was tagged out by Chase Utley sliding back to second.
After Ryan Madson pitched a scoreless eighth inning, Brad Lidge earned his 17th save in 21 chances. It was the seventh straight save for Lidge, who struck out Dunn with the tying run on second. Marquis had his best start of the season, going five innings and allowing one run on four hits. It was the third start for the right-hander since having elbow surgery May 14.
The only run Marquis allowed came on a play that could have been an out. With Utley and Jayson Werth on base, Ruiz scorched a ball down the first-base line that glanced off Dunn's glove and into right field.
NOTES: Halladay balked in the first inning, his first since April 19, 2005. With his fourth-inning steal, Philadelphia's Jimmy Rollins has stolen 30 consecutive bases without being caught. Washington's Ivan Rodriguez was 1-for-3 off Halladay and is now 14-for-35 (.400) lifetime against the Phillies right-hander.