Download PHP Chess Parser
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
No one has commented this - be first!
Post your comment
Comment preview: