Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
PHP if (($lines[$x] == "\r") || ($lines[$x] == "")) 2x true möglich?
- Ersteller smallwall
- Erstellt am
r15ch13
Lieutenant
- Registriert
- Dez. 2003
- Beiträge
- 790
Hatte langweile:
Man koennte jetzt noch eine Template-Engine verwenden um es noch huebscher zu machen.
Ausserdem meinte kling1 mit "nicht ordentlich", dass dein Code unleserlich und aufanhieb schlecht zu verstehen ist.
Durch leserlichen Code kannst du in Foren auch eher Hilfe erwarten, da Helfer eher gewillt sind diesen zu lesen.
Quellcode ist fuer Menschen! Dem Compiler/Interpreter ist es ziemlich egal wie die Variablen/Funktionen heissen. Aber weisst du naechsten Monat noch was sie bedeuten? (Buchtipp: Weniger schlecht programmieren)
- Hilfsklasse Game hinzugefuegt
- Funktion zum einlesen der pgn-Dateien von HTML getrennt
- Formular anders aufgebaut. (Mit print_r($_POST); einfach mal das Ergebnis anschauen)
Man koennte jetzt noch eine Template-Engine verwenden um es noch huebscher zu machen.
Ausserdem meinte kling1 mit "nicht ordentlich", dass dein Code unleserlich und aufanhieb schlecht zu verstehen ist.
Durch leserlichen Code kannst du in Foren auch eher Hilfe erwarten, da Helfer eher gewillt sind diesen zu lesen.
Quellcode ist fuer Menschen! Dem Compiler/Interpreter ist es ziemlich egal wie die Variablen/Funktionen heissen. Aber weisst du naechsten Monat noch was sie bedeuten? (Buchtipp: Weniger schlecht programmieren)
PHP:
<?php
$file = "pach.pgn";
$games = readGamesFromPgn($file);
class Game
{
private $info = [];
private $moves = '';
public function __construct()
{
}
public function addInfo($name, $value)
{
$this->info[$name] = $value;
return $this;
}
public function getInfo()
{
return $this->info;
}
public function addMoves($moves)
{
$this->moves .= $moves;
return $this;
}
public function getMoves()
{
return $this->moves;
}
}
function readGamesFromPgn($file)
{
if(!file_exists($file)) return [];
$content = file_get_contents($file);
$lines = explode("\n", $content);
$games = [];
$game = null;
foreach ($lines as $line)
{
// Neues Spiel gefunden
if(strpos($line, '[Event') !== false)
{
if(!empty($game))
{
$games[] = $game;
}
$game = new Game();
}
if(strpos($line, '[') !== false)
{
$infoName = substr($line, 1, strpos($line, ' ') - 1);
$infoValue = substr($line, strpos($line, '"') + 1, -3);
if(!empty($game))
{
$game->addInfo($infoName, $infoValue);
}
}
else
{
if(!empty($line) && !empty($game))
{
$game->addMoves($line);
}
}
}
return $games;
}
?><!DOCTYPE HTML>
<html>
<head>
<meta name="author" content="cli">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="description" content="description">
<meta name="keywords" content="keywords">
<!-- keep double inclusion of google fonts to prevent trouble in some IE-->
<link href='http://fonts.googleapis.com/css?family=Varela+Round' rel='stylesheet' type='text/css'>
<link href="http://www.devphp.de/pgn/css/dev.css" rel="stylesheet" type="text/css">
<title>develop in php, or learn to</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript" src="http://www.devphp.de/count/count.js"></script>
</head>
<body>
<h2>Änderung an <?php echo $file; ?></h2>
<form action="index.php" method="post" class="readpgn">
<?php
foreach ($games as $gamenum => $game)
{
foreach ($game->getInfo() as $info => $infoValue)
{
echo '<label for="game[' . $gamenum . '][info][' . $info . ']">' . $info . ' </label>' . PHP_EOL;
echo '<input type="text" value="' . $infoValue . '" name="game[' . $gamenum . '][info][' . $info . ']"><br><br>' . PHP_EOL;
}
echo '<label for="game[' . $gamenum . '][moves]">Moves <div class="small">Änderungen hier sind nicht empfohlen</div></label>' . PHP_EOL;
echo '<textarea name="game[' . $gamenum . '][moves]" rows="20" cols="90">';
echo $game->getMoves();
echo '</textarea><br>' . PHP_EOL;
echo '<hr>';
}
?>
<?php echo count($games); ?> Games in this .pgn file.<br>
<br><input type="hidden" id="file" name="filename" value="<?php echo $file; ?>">
<br><label for="pw">Passwort </label>
<input type="password" name="pw" id="pw" maxlength="64">
<br><br><input type="submit" id="ok" value=" Ändern "> <input type="reset" id="reset" value=" Reset ">
</form>
<body>
</html>
Zuletzt bearbeitet:
(Buchtipp)
Sieht wirklich hübsch aus, liefert nur eine falsche Ausgabe. [game "Array"] steht mit meiner writepgn.php in der geschriebenen file. Du kannst die http://www.devphp.de/pgn/writepgn.php benutzen, wenn Du möchtest, das Passwort ist "abc". Ich poste hier mal den relevanten Teil, damit wird mit meiner Version eine tadellose Ausgabe erzeugt.
Ahso, ja kein Wunder, bei Dir heisst die Textarea anders.
Code:
if (!empty($_POST["filename"]) && (($_POST["pw"] == $p->adminpw)) || ($_POST["pw"] == $p->userpw)) {
$push_here = array();
foreach ($_POST as $key => $value) {
// strip numbers from names
$thf = trim(str_replace(range(0, 9), '', $key));
// if name begins with... is not header
if (strpos($key, 'thisismovesline') === 0) {
array_push($push_here, $value);
} else {
if ($key != "pw" && $key != "filename") {
// recreate header fields
$line = "[" . $thf . " \"" . $value . "\"]";
array_push($push_here, $line);
}
}
}
try {
$push_here = implode("\r\n", $push_here);
...
file_put_contents();etc
Ahso, ja kein Wunder, bei Dir heisst die Textarea anders.
Zuletzt bearbeitet:
Wusste nicht, dass man Arrays per POST übertragen kann, das macht so einiges einfacher. Ich schau mir das morgen weiter an...
An Deiner Lösung finde ich nicht gut, dass Du vorraussetzt, dass eine Partiebeschreibung mit "[Event" anfängt. Das ist zwar richtig und steht auch so in der Spezifikation, aber meine Lösung ("in die nächste Zeile schauen") finde ich persönlich besser, da ist es egal, welches Headerfeld zuerst kommt.
Nunja, wie auch immer, Story continues.... meine writepgn.php sieht für Deine Version so aus:
Sie hat einen Fehler, nach den Zügen werden 2 Leerzeilen ausgegeben, nicht eine. Ich verstehe nicht woher die 2. Leerzeile kommt. Schon die Leerzeile vor den Zügen muss ich in Zeile 14 selbst erzeugen, nach den Zügen kommen 2 Leerzeilen, obwohl in der Quelldatei halt nur eine Leerzeile ist. Sind die Array-keys irgendwie sortiert durch den POST? Bin mal wieder mit meinem Latein am Ende
Edit: $value2 ist ja gar kein array. Ich versuche jetzt das letzte newline abzuschneiden.
Ergänzung ()
An Deiner Lösung finde ich nicht gut, dass Du vorraussetzt, dass eine Partiebeschreibung mit "[Event" anfängt. Das ist zwar richtig und steht auch so in der Spezifikation, aber meine Lösung ("in die nächste Zeile schauen") finde ich persönlich besser, da ist es egal, welches Headerfeld zuerst kommt.
Nunja, wie auch immer, Story continues.... meine writepgn.php sieht für Deine Version so aus:
Code:
$lines = [];
foreach ($_POST['game'] as $key => $value) {
foreach ($value as $key2 => $value2) {
if (is_array($value2)) {
foreach ($value2 as $key3 => $value3) {
$line = "[" . $key3 . " \"" . $value3 . "\"]";
array_push($lines, $line);
}
} else {
array_push($lines, "");
array_push($lines, $value2);
}
}
}
$lines = implode("\r\n", $lines);
echo "<pre>";
echo $lines;
echo "</pre>";
Sie hat einen Fehler, nach den Zügen werden 2 Leerzeilen ausgegeben, nicht eine. Ich verstehe nicht woher die 2. Leerzeile kommt. Schon die Leerzeile vor den Zügen muss ich in Zeile 14 selbst erzeugen, nach den Zügen kommen 2 Leerzeilen, obwohl in der Quelldatei halt nur eine Leerzeile ist. Sind die Array-keys irgendwie sortiert durch den POST? Bin mal wieder mit meinem Latein am Ende
Edit: $value2 ist ja gar kein array. Ich versuche jetzt das letzte newline abzuschneiden.
Zuletzt bearbeitet:
r15ch13
Lieutenant
- Registriert
- Dez. 2003
- Beiträge
- 790
Funktion in Game Klasse aendern. Dann sind die zusaetzlichen Leerzeilen weg.
Und in der writepgn.php:
Btw erster Hinweis zu array_push(): Wenn Sie array_push() verwenden, um ein Element an ein Array anzuhängen, ist es besser $array[] = zu benutzen, da dies den zusätzlichen Aufwand vermeidet, eine Funktion aufzurufen
Code:
public function getMoves()
{
return trim($this->moves);
}
Und in der writepgn.php:
Code:
$lines = [];
foreach ($_POST['game'] as $key => $value) {
foreach ($value as $key2 => $value2) {
if (is_array($value2)) {
foreach ($value2 as $key3 => $value3) {
$lines[] = '[' . trim($key3) . ' "' . trim($value3) . '"]';
}
} else {
$lines[] = "";
$lines[] = $value2;
}
}
$lines[] = "";
}
$lines = implode("\n", $lines);
echo "<pre>";
echo $lines;
echo "</pre>";
Btw erster Hinweis zu array_push(): Wenn Sie array_push() verwenden, um ein Element an ein Array anzuhängen, ist es besser $array[] = zu benutzen, da dies den zusätzlichen Aufwand vermeidet, eine Funktion aufzurufen
Ohje, da ist immer noch etwas im Argen... Deine Version liest die letzte Partie nicht mehr.
http://www.devphp.de/pgn/readpgn.php 10 Games in this .pgn file.
http://www.devphp.de/pgn/readsuggest.php 9 Games in this .pgn file.
http://www.devphp.de/pgn/viewedit.php?view=./pgnfiles/edits/pach.pgn.2015-09-17 17:58:35.edit
Die letzte Partie fehlt einfach. Wie kann das sein?
Und noch etwas für übermorgen: Wie kann man die Züge noch am besten aufdröseln? So dass ich vielleicht ein Array habe mit [0] e4 [1] c5 [2]Nf3 [3]Nc6 etc... Die .pgn Files sind meistens in Englischer Notation, N=Knight=Springer etc. Besonders heikel sind Pariten mit Kommentaren in den Zügen, siehe http://www.devphp.de/pgn/pgnfiles/hermanndemo.pgn
Die Kommentare stehen immer in geschweiften Klammern.
Vielen Dank für Ihre Aufmerksamkeit.
http://www.devphp.de/pgn/readpgn.php 10 Games in this .pgn file.
http://www.devphp.de/pgn/readsuggest.php 9 Games in this .pgn file.
http://www.devphp.de/pgn/viewedit.php?view=./pgnfiles/edits/pach.pgn.2015-09-17 17:58:35.edit
Die letzte Partie fehlt einfach. Wie kann das sein?
Und noch etwas für übermorgen: Wie kann man die Züge noch am besten aufdröseln? So dass ich vielleicht ein Array habe mit [0] e4 [1] c5 [2]Nf3 [3]Nc6 etc... Die .pgn Files sind meistens in Englischer Notation, N=Knight=Springer etc. Besonders heikel sind Pariten mit Kommentaren in den Zügen, siehe http://www.devphp.de/pgn/pgnfiles/hermanndemo.pgn
Die Kommentare stehen immer in geschweiften Klammern.
Vielen Dank für Ihre Aufmerksamkeit.
r15ch13
Lieutenant
- Registriert
- Dez. 2003
- Beiträge
- 790
Uh mist. Habe ich uebersehen 
Einfach in der readGamesFromPgn() nach dem foreach einfuegen:
Vielleicht noch diese Paket fuer dich interessant: https://github.com/amyboyd/pgn-parser
(Kannst du mit https://getcomposer.org/ als Dependency zu deinem Projekt hinzufuegen)
Ich weiss jetzt aber nicht ob du die Annotations brauchst. Der Parser wirft die naemlich raus: https://github.com/amyboyd/pgn-parser/blob/master/src/AmyBoyd/PgnParser/PgnParser.php#L191
Einfach in der readGamesFromPgn() nach dem foreach einfuegen:
Code:
if(!empty($game))
{
$games[] = $game;
}
Vielleicht noch diese Paket fuer dich interessant: https://github.com/amyboyd/pgn-parser
(Kannst du mit https://getcomposer.org/ als Dependency zu deinem Projekt hinzufuegen)
Ich weiss jetzt aber nicht ob du die Annotations brauchst. Der Parser wirft die naemlich raus: https://github.com/amyboyd/pgn-parser/blob/master/src/AmyBoyd/PgnParser/PgnParser.php#L191
Code:
<?php
require_once "vendor/autoload.php";
use AmyBoyd\PgnParser\Game;
use AmyBoyd\PgnParser\PgnParser;
$parser = new PgnParser("hermanndemo.pgn");
$game = $parser->getGame(0);
echo '<pre>';
print_r($game->getMovesArray());
echo '</pre>';
Zuletzt bearbeitet:
Hm, das schau ich mir an. Es wär gut, wenn man Annotations auch irgendwie verwerten kann, und vor allem auch erstellen, aber wenn ich nur die Züge bekomme, ist das auch nicht so schlimm.
Naja, erstmal danke für die Hilfe
Edit: Hm naja das klappt bei mir nicht, braucht mein Webspace diesen Composer? Habe es jetzt einfach herunter geladen und auf meine Webspace geschoben, aber die Readme ist nicht wirklich hilfreich. "If you use Composer, require this library with:" ... tja habe wohl keinen Composer. Und ein einfaches include reicht wohl nicht.
Naja, erstmal danke für die Hilfe
Edit: Hm naja das klappt bei mir nicht, braucht mein Webspace diesen Composer? Habe es jetzt einfach herunter geladen und auf meine Webspace geschoben, aber die Readme ist nicht wirklich hilfreich. "If you use Composer, require this library with:" ... tja habe wohl keinen Composer. Und ein einfaches include reicht wohl nicht.
Zuletzt bearbeitet:
- Registriert
- März 2008
- Beiträge
- 1.373
Composer ist ein Progrämmchen, das du wie jedes andere einfach in der Konsole ausführen kannst. Wenn du kein Composer hast, ist das auch nicht weiter schlimm. Trotzdem kannst du die Bibliothek nutzen, musst dann eben lokal Composer installieren und dann alle Dateien hochladen (inklusive der autoload.php von composer).
Besagte autoload.php kannst du dann mit einem include in deinem Script inkludieren und der Autoloader sollte funktionieren
Besagte autoload.php kannst du dann mit einem include in deinem Script inkludieren und der Autoloader sollte funktionieren
Hm naja, ich hab mir Composer geladen, aber bei der installation will er den Pfad zur php.exe wissen. Habe PHP halt nur auf dem Webserver, und wenn das auf dem Webserver nicht läuft hilft es mir auch nicht viel...
- Registriert
- März 2008
- Beiträge
- 1.373
Na aber doch sicher. Wie entwickelst du denn? Lokal?
Dann hast du ja sicher irgendwo auch eine php.exe liegen, ansonsten => https://secure.php.net/
Dann hast du ja sicher irgendwo auch eine php.exe liegen, ansonsten => https://secure.php.net/
r15ch13
Lieutenant
- Registriert
- Dez. 2003
- Beiträge
- 790
Installiere dir einen lokalen Webserver z.B. XAMPP oder Bitnami WAMP Stack (zum Entwickeln, sowieso besser)
Installiere dann Composer.
Lass Composer die Abhaenigkeiten herunterladen.
Lade dein Projekt auf den Server.
Composer ist auf jedenfall zu empfehlen. Auf Packagist kann man nach Projekten suchen, bevor man versucht das Rad neu zu erfinden
Installiere dann Composer.
Lass Composer die Abhaenigkeiten herunterladen.
Lade dein Projekt auf den Server.
Composer ist auf jedenfall zu empfehlen. Auf Packagist kann man nach Projekten suchen, bevor man versucht das Rad neu zu erfinden
K
kling1
Gast
zum entwickeln.. vagrant.. ist eh nich gerade klug einen webserver auf seinem lokalen rechner zu installieren.. einen webserver auf einem windows system zu installieren ist sogar richtig dumm 
scotchbox läuft gut unter windows http://box.scotch.io
scotchbox läuft gut unter windows http://box.scotch.io
rg88
Fleet Admiral
- Registriert
- Feb. 2015
- Beiträge
- 35.561
kling1 schrieb:zeinen webserver auf einem windows system zu installieren ist sogar richtig dumm![]()
Begründung?
K
kling1
Gast
vll weil die entwicklungs umgebung sich komplett von der produktivumgebung unterscheidet.. aber ist halt auch nur ein grund von vielenrg88 schrieb:Begründung?
Direkt auf dem Webserver, devphp.de. Netbeans läd die Seiten direkt nach dem Save hoch und ich drücke F5 im Browser.Wie entwickelst du denn? Lokal?
Ohje, wie ich das gefummel hasse. Ich habe jetzt Bitnami WAMP Stack installiert, danach Composer. Und es läuft nicht, ich habe ka ob Composer richtig installiert ist. Im geposteten PHP
ist schonmal kein Unterverzeichnis "vendor" zu finden, also schlägt des require fehl.
Der Bitnami Installer/Programm hat schonmal keine Option um MySQL user/pw hinzuzufügen etc. das ist übelstes gefummel für mich. Die Anleitungen etc heraussuchen, puh, da hab ich schon extrem wenig bock zu, muss ich sagen
Hat jemand ein paar Tips? Installiert scheint es ja zu sein, wie starte ich Composer dann?
<?php
require_once "vendor/autoload.php";
use AmyBoyd\PgnParser\Game;
use AmyBoyd\PgnParser\PgnParser;
$parser = new PgnParser("hermanndemo.pgn");
$game = $parser->getGame(0);
echo '<pre>';
print_r($game->getMovesArray());
echo '</pre>';
ist schonmal kein Unterverzeichnis "vendor" zu finden, also schlägt des require fehl.
Der Bitnami Installer/Programm hat schonmal keine Option um MySQL user/pw hinzuzufügen etc. das ist übelstes gefummel für mich. Die Anleitungen etc heraussuchen, puh, da hab ich schon extrem wenig bock zu, muss ich sagen
Hat jemand ein paar Tips? Installiert scheint es ja zu sein, wie starte ich Composer dann?
Zuletzt bearbeitet:
r15ch13
Lieutenant
- Registriert
- Dez. 2003
- Beiträge
- 790
Composer ist ein Kommandozeilen Tool. Pruefen ob es richtig installiert ist:
Navigiere in deinen Projekt Ordner und fuehre dann diesen Befehl aus:
Dadurch wird pgn-parser als Dependency zu deinem Projekt hinzugefuegt. Hier noch mal ein Video Tutorial:
https://www.youtube.com/watch?v=Ejr4Xqs9V2I
Wenn du mit Composer umgehen kannst, dann erleichtert er dir die Arbeit mit Abhaengigkeiten zu anderen Projekten und Libraries enorm!
Code:
composer -v
Navigiere in deinen Projekt Ordner und fuehre dann diesen Befehl aus:
Code:
composer require "amyboyd/pgn-parser"
Dadurch wird pgn-parser als Dependency zu deinem Projekt hinzugefuegt. Hier noch mal ein Video Tutorial:
https://www.youtube.com/watch?v=Ejr4Xqs9V2I
Wenn du mit Composer umgehen kannst, dann erleichtert er dir die Arbeit mit Abhaengigkeiten zu anderen Projekten und Libraries enorm!