/')."\n"; } function GetSimpleAttr($str){ echo " ".$str."=ON"; } function GetValueAttr($str){ $v=explode("=",$str,2); echo " ".$v[0]."=".$v[1]; } //---------Programming the FSM: //In normal state, catch opening or simple tag start $parser->FSM('/FSM('/<\/\w+\s*>/','return ClosingTag($STRING);','CDATA','CDATA'); //In normal state, catch all other data $parser->FSM('/./s','echo $STRING;','CDATA','CDATA'); //First word after tag start would be tag name $parser->FSM('/[\w_]+/','return BeginTag($STRING);','IN_TAG','TAG_OPEN'); //While in tag, catch simple attributes $parser->FSM('/[\w_]+/','return GetSimpleAttr($STRING);','IN_TAG','IN_TAG'); //While in tag, catch attributes with values $parser->FSM('/[\w_]+=[\'""][^\'"]*[\'"]/','return GetValueAttr($STRING);','IN_TAG','IN_TAG'); //While in tag, catch tag closing $parser->FSM('/\/?>/','return EndTag($STRING);','CDATA','IN_TAG'); //---------Run the parser $parser->ParseFile("example.xml","CDATA"); ?>