Download PHP Chess Parser

Bookmark and Share

Licensing

This script is distributed under the LGPL open source license.
Commercial licenses are also available. Some of these licenses also includes personal e-mail support for up to 1 year.

Download files

You can download the the chess parser from this zip file or from GitHub.

Classes:

  • PgnParser: Converts pgn files/strings to JSON format.
  • FenParser0x88: Parser for a chess game. Can be used to make moves, get notations, valid moves, fen position etc.

Key features of the PgnParser:

  • Unlimited variations
  • Supports custom startup position
  • Creates FEN position for all the moves.

This is the chess parser used in DHTML Chess at dhtmlchess.com

Example of use:

<?php $parser = new PgnParser('my-games.pgn'); echo json_encode($parser->getGames()); ?>

This will give you data in this format:

[ { "metadata":{ "blackelo":"2400", "opening":"Grunfeld", "time":"10:41:37", "variation":"Three Knights Variation", "whiteelo":"2400", "whitetype":"human", "blacktype":"human", "castle":1 }, "event":"Computer chess game", "site":"Somewhere", "date":"2013.01.19", "round":"?", "white":"White player", "black":"Black player", "result":"*", "eco":"D90", "timecontrol":"300", "termination":"unterminated", "plycount":"21", "fen":"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", "moves":[ { "m":"e4", "from":"e2", "to":"e4", "fen":"rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq - 0 1" }, { "m":"d5", "variations":[ [ { "m":"e5", "comment":"Test comment before", "from":"e7", "to":"e5", "fen":"rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2" }, { "m":"Nf3", "comment":"Test comment after", "from":"g1", "to":"f3", "fen":"rnbqkbnr/pppp1ppp/8/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - 1 2" }, { "m":"Nc6", "from":"b8", "to":"c6", "fen":"r1bqkbnr/pppp1ppp/2n5/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - 2 3" }, { "m":"Bc4", "from":"f1", "to":"c4", "fen":"r1bqkbnr/pppp1ppp/2n5/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R b KQkq - 3 3" }, { "m":"Nf6", "variations":[ [ { "m":"d6", "from":"d7", "to":"d6", "fen":"r1bqkbnr/ppp2ppp/2np4/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R w KQkq - 0 4" }, { "m":"O-O", "comment":"(O-O Ng8-f6 Nb1-c3 Nc6-d4 Nf3-g5 d6-d5 e4xd5 h7-h6 Ng5-e4 c7-c6 d5xc6 Nf6xe4 Nc3xe4 b7xc6) +0.48/11 8", "from":"e1", "to":"g1", "fen":"r1bqkbnr/ppp2ppp/2np4/4p3/2B1P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - 1 4" }, { "m":"Nf6", "from":"g8", "to":"f6", "fen":"r1bqkb1r/ppp2ppp/2np1n2/4p3/2B1P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - 2 5" }, { "m":"Nc3", "comment":"Last move in variation", "from":"b1", "to":"c3", "fen":"r1bqkb1r/ppp2ppp/2np1n2/4p3/2B1P3/2N2N2/PPPP1PPP/R1BQ1RK1 b kq - 3 5" } ] ], "from":"g8", "to":"f6", "fen":"r1bqkb1r/pppp1ppp/2n2n2/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R w KQkq - 4 4" }, { "m":"O-O", "comment":"Variation ended", "from":"e1", "to":"g1", "fen":"r1bqkb1r/pppp1ppp/2n2n2/4p3/2B1P3/5N2/PPPP1PPP/RNBQ1RK1 b kq - 5 4" }, { "m":"d6", "from":"d7", "to":"d6", "fen":"r1bqkb1r/ppp2ppp/2np1n2/4p3/2B1P3/5N2/PPPP1PPP/RNBQ1RK1 w kq - 0 5" } ] ], "from":"d7", "to":"d5", "fen":"rnbqkbnr/ppp1pppp/8/3p4/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2" }, { "m":"exd5", "comment":"Variation ended", "from":"e4", "to":"d5", "fen":"rnbqkbnr/ppp1pppp/8/3P4/8/8/PPPP1PPP/RNBQKBNR b KQkq - 0 2" }, { "m":"Nf6", "from":"g8", "to":"f6", "fen":"rnbqkb1r/ppp1pppp/5n2/3P4/8/8/PPPP1PPP/RNBQKBNR w KQkq - 1 3" }, { "m":"c4", "variations":[ [ { "m":"Nf3?!", "from":"g1", "to":"f3", "fen":"rnbqkb1r/ppp1pppp/5n2/3P4/8/5N2/PPPP1PPP/RNBQKB1R b KQkq - 2 3" }, { "m":"Qxd5", "from":"d8", "to":"d5", "fen":"rnb1kb1r/ppp1pppp/5n2/3q4/8/5N2/PPPP1PPP/RNBQKB1R w KQkq - 0 4" }, { "m":"Nc3", "from":"b1", "to":"c3", "fen":"rnb1kb1r/ppp1pppp/5n2/3q4/8/2N2N2/PPPP1PPP/R1BQKB1R b KQkq - 1 4" }, { "m":"Qa5", "from":"d5", "to":"a5", "fen":"rnb1kb1r/ppp1pppp/5n2/q7/8/2N2N2/PPPP1PPP/R1BQKB1R w KQkq - 2 5" }, { "m":"d4", "from":"d2", "to":"d4", "fen":"rnb1kb1r/ppp1pppp/5n2/q7/3P4/2N2N2/PPP2PPP/R1BQKB1R b KQkq - 0 5" } ] ], "from":"c2", "to":"c4", "fen":"rnbqkb1r/ppp1pppp/5n2/3P4/2P5/8/PP1P1PPP/RNBQKBNR b KQkq - 0 3" }, { "m":"Bf5", "comment":"Variation ended", "variations":[ [ { "m":"Nbd7", "from":"b8", "to":"d7", "fen":"r1bqkb1r/pppnpppp/5n2/3P4/2P5/8/PP1P1PPP/RNBQKBNR w KQkq - 1 4" }, { "m":"Nf3", "from":"g1", "to":"f3", "fen":"r1bqkb1r/pppnpppp/5n2/3P4/2P5/5N2/PP1P1PPP/RNBQKB1R b KQkq - 2 4" }, { "m":"Nb6", "from":"d7", "to":"b6", "fen":"r1bqkb1r/ppp1pppp/1n3n2/3P4/2P5/5N2/PP1P1PPP/RNBQKB1R w KQkq - 3 5" }, { "m":"d4", "from":"d2", "to":"d4", "fen":"r1bqkb1r/ppp1pppp/1n3n2/3P4/2PP4/5N2/PP3PPP/RNBQKB1R b KQkq d3 0 5" }, { "m":"g6", "from":"g7", "to":"g6", "fen":"r1bqkb1r/ppp1pp1p/1n3np1/3P4/2PP4/5N2/PP3PPP/RNBQKB1R w KQkq - 0 6" }, { "m":"Nc3", "from":"b1", "to":"c3", "fen":"r1bqkb1r/ppp1pp1p/1n3np1/3P4/2PP4/2N2N2/PP3PPP/R1BQKB1R b KQkq - 1 6" }, { "m":"Qd6", "from":"d8", "to":"d6", "fen":"r1b1kb1r/ppp1pp1p/1n1q1np1/3P4/2PP4/2N2N2/PP3PPP/R1BQKB1R w KQkq - 2 7" } ] ], "from":"c8", "to":"f5", "fen":"rn1qkb1r/ppp1pppp/5n2/3P1b2/2P5/8/PP1P1PPP/RNBQKBNR w KQkq - 1 4" }, { "m":"Nf3", "from":"g1", "to":"f3", "fen":"rn1qkb1r/ppp1pppp/5n2/3P1b2/2P5/5N2/PP1P1PPP/RNBQKB1R b KQkq - 2 4" } ] } ]

Example: Make moves

FenParser0x88 can be used to manually make moves on the board.

Example:

$parser = new FenParser0x88(); $parser->setFen('rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1'); $parser->move("g1f3"); echo $parser->getNotation(); // Returns Nf3 echo $parser->getFen(); // Returns new fen position

Example: Get valid moves

This is an example on how to retrieve all valid moves in a position:

$parser = new FenParser0x88('6k1/6p1/4n3/8/8/8/B7/6K1 b - - 0 1'); $validBlackMoves = $parser->getValidMovesBoardCoordinates("black"); echo json_encode($validBlackMoves);

which outputs

{"g8":["f7","h7","f8","h8"],"g7":["g6","g5"],"e6":[]}

Here, the king on g8 can move to the squares f7, h7, f8, h8.

In this position, there's a black knight on e6 which is pinned by a white bishop on a2. That's why it doesn't have any squares to move to ("e6": []).

Comments

lee
[Event "?"]
[Site "Chess.com iPhone"]
[Date "2024.12.11"]
[Round "?"]
[White "Guest0961739755"]
[Black "Guest7041607084"]
[Result "1-0"]
[FEN "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"]
[WhiteElo "400"]
[BlackElo "400"]

1.d4 d6 2.Bf4 f6 3.e3 e5 4.dxe5 fxe5 5.Bg3 Qf6 6.Bd3 Nh6 7.Nc3 Nc6 8.f4 Bg4 9.Nf3 exf4 10.Bxf4 Bh5 11.O-O Ne7 12.g3 Nef5 13.Nb5 Qf7 14.c4 a5 15.Qa4 c6 16.Bxf5 Nxf5 17.Bg5 Nxe3 18.Ne5 Qd5 19.Nc7# {1-0}
lee at 04:35AM, 2024/12/11.

Post your comment

Don't have an avatar? Create one at Gravatar.com.

Confirmation code:

Go to cbolson.com


About/Contact | A good idea? | Submit a script | Privacy notice
© 2005 - 2024 dhtmlgoodies.com