Stringbearbeitung in Javascript (HTML Seite einlesen?)
Jan K.
- javascript
1 Ashura0 Der Martin
0 Jan K.
Hallo zusammen,
ich möchte gerne daten aus dem HTML Quelltext einer anderern Seite einlesen. Das mache ich momentan in PHP mit explode und sieht ca. so aus:
--------------------------------------------------------------------
$_POST[clan] = str_replace("§","§",$_POST[clan]);
$link=$_POST[clan];
if ( !(empty($_POST[clan])) ) {
if ( !(file_exists($link)) ) { mkdir($link); }
$papu=file_get_contents("http://www.battle.net/war3/ladder/w3xp-clan-profile.aspx?Gateway=Northrend&ClanTag=$link");
$papu = htmlspecialchars($papu);
$seiten=explode("PageNo=", $papu);
$anzahl1 = (count($seiten));
$seiten=explode(">", $seiten[2]);
$seiten[0]=str_replace(""","",$seiten[0]);
for ($x=1;$x<=$seiten[0];$x++){
unset($zw1);
$popo=file_get_contents("http://www.battle.net/war3/ladder/w3xp-clan-profile.aspx?ClanTag=$link&Gateway=Northrend&SortField=rank%20DESC,%20online%20desc&SortDir=Asc&PageNo=$x");
$popo = htmlspecialchars($popo);
$zw=explode("PlayerName=", $popo);
$anzahl = (count($zw));
for($i=1;$i<=($anzahl-1);$i++) {
$zw1[$i]=explode(">", $zw[$i]);
}
for ($i=1;$i<=15;$i++){
if ( !(empty($zw1[$i][1])) ){
$zw1[$i][1]=str_replace("</a","",$zw1[$i][1]);
$ueb=$ueb.$zw1[$i][1]."§";
}
}
}
$pdat = fopen("$link/player.txt", "w+");
fwrite($pdat, $ueb);
fclose($pdat);
}
--------------------------------------------------------------------
Dieser Teil liest erstmal alle Spielernamen (15 Spieler pro Seite) von beliebig vielen Seiten ein (durchnittlich 5 seiten). Anschließend werden in einem anderen Teil ca. zehn detailinformationen jedes spielers (für jeden spieler eine andere Seite) abgefragt.
Das problematische daran ist, daß ich nach einer Handvoll Anfragen ein Gateway Tiemout bekomme, da mein script in zu kurzer Zeit zuviele Anfragen stellt.
Da mit PHP das Ergebnis erst angezeigt wird, wenn das Script fertig geladen ist (leerer Browser solange in bearbeitung u.U. 20sec) und keine Zwischenergebnisse angezeigt werden, dachte ich mir das ganze doch in Javascript zu gestalten und zwichen jeder abfrage ein bisschen pause einzulegen, um den Gateway Timeout zu vermeiden.
Den ganzen Grundschleim von javascript hab ich mir zwar schon des öfteren durchgelsen aber bisher noch nichts konkretes damit gemacht (diese Syntax is doch voll behämmert this.zickezacke so ein Unsinn!).
Meine Frage ist jetzt, kann ich in Javascript eine komplette HTML Seite einlesen und diese dann wie im obrigen besispiel (mit explode und str_replace) mit Stringfunktionen verarbeiten? Und wie heißen die konkreten Funktionen/Objekte(was auch immer in js)?
Gruß,
Jan
Hallo Jan.
$_POST[clan] = str_replace("§","§",$_POST[clan]);
$link=$_POST[clan];
if ( !(empty($_POST[clan])) ) {
if ( !(file_exists($link)) ) { mkdir($link); }
$papu=file_get_contents("http://www.battle.net/war3/ladder/w3xp-clan-profile.aspx?Gateway=Northrend&ClanTag=$link");
$papu = htmlspecialchars($papu);
$seiten=explode("PageNo=", $papu);
$anzahl1 = (count($seiten));
$seiten=explode(">", $seiten[2]);
$seiten[0]=str_replace(""","",$seiten[0]);
for ($x=1;$x<=$seiten[0];$x++){
unset($zw1);
$popo=file_get_contents("http://www.battle.net/war3/ladder/w3xp-clan-profile.aspx?ClanTag=$link&Gateway=Northrend&SortField=rank%20DESC,%20online%20desc&SortDir=Asc&PageNo=$x");
$popo = htmlspecialchars($popo);
$zw=explode("PlayerName=", $popo);
$anzahl = (count($zw));
for($i=1;$i<=($anzahl-1);$i++) {
$zw1[$i]=explode(">", $zw[$i]);
}
for ($i=1;$i<=15;$i++){
if ( !(empty($zw1[$i][1])) ){
$zw1[$i][1]=str_replace("</a","",$zw1[$i][1]);
$ueb=$ueb.$zw1[$i][1]."§";
}
}
}
$pdat = fopen("$link/player.txt", "w+");
fwrite($pdat, $ueb);
fclose($pdat);
}
Nichts zu deinem eigentlichen Anliegen, aber:
1\. Gestalte deinen Quellcode bitte menschenlesbar (Einrückungen, Leerzeilen, Kommentare). Obiger Codeklumpen ist extrem unhandlich und schwierig lesbar
2\. $\_POST[clan]: Du hast eine [Konstante](http://www.php.net/manual/de/language.constants.php) namens „clan“ deklariert? Wenn nicht, dann solltest du [error_reporting](http://de2.php.net/manual/de/function.error-reporting.php) auf E\_ALL stellen (und dies \_immer\_ während des Entwicklungsprozesses tun) und dir noch einmal anschauen, wie man auf [Arrayelemente](http://www.php.net/manual/de/language.types.array.php) zugreift.
Einen schönen Samstag noch.
Gruß, Ashura
--
sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
„It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
[[HTML Design Constraints: Logical Markup](http://www.w3.org/History/19921103-hypertext/hypertext/WWW/MarkUp/HTMLConstraints.html)]
Hallo Jan,
erstmal kann ich mich aus voller Überzeugung dem anschließen, was Ashura schon gesagt hat (Übersichtlichkeit und Arrayzugriff bzw. Error Reporting).
Da mit PHP das Ergebnis erst angezeigt wird, wenn das Script fertig geladen ist (leerer Browser solange in bearbeitung u.U. 20sec) und keine Zwischenergebnisse angezeigt werden, dachte ich mir das ganze doch in Javascript zu gestalten und zwichen jeder abfrage ein bisschen pause einzulegen, um den Gateway Timeout zu vermeiden.
Das Timeout-Problem gibt es in Javascript auch: Scripts, die zu lange laufen, werden irgendwann (typischerweise nach 5..10s) vom Browser beendet, wobei der Benutzer in der Regel vorher gefragt wird und auf Wunsch dem Script etwas mehr Zeit geben kann. Aber in JS kannst du solche Sachen eventgesteuert machen, also Ressourcen anfordern -entweder in ein unsichtbares Frame oder mit AJAX-Methoden- und über einen Eventhandler den nächsten Teil des Scripts erst dann aufrufen lassen, wenn die Daten empfangen wurden bzw. das Laden fehlgeschlagen ist. Dann hast du kein Timeout-Problem, weil kein längeres Script "am Stück" durchläuft.
Den ganzen Grundschleim von javascript hab ich mir zwar schon des öfteren durchgelsen aber bisher noch nichts konkretes damit gemacht (diese Syntax is doch voll behämmert this.zickezacke so ein Unsinn!).
Wenn man den Sinn von 'this' erstmal verstanden hat, erscheint es einem völlig logisch und ungemein praktisch. Nebenbei gibt's das in PHP auch, und sogar mit ungefähr derselben Syntax und demselben Zweck, nämlich als bequem handhabbare Referenz auf das aktuelle Objekt, in dessen Kontext die ausgeführte Anweisung steht.
Meine Frage ist jetzt, kann ich in Javascript eine komplette HTML Seite einlesen und diese dann wie im obrigen besispiel (mit explode und str_replace) mit Stringfunktionen verarbeiten? Und wie heißen die konkreten Funktionen/Objekte(was auch immer in js)?
Hmm. Die Stringfunktionen in Javascript sind leider bei weitem nicht so vielfältig und mächtig wie in PHP. Meiner Ansicht nach tust du dir mit einer Portierung deiner Aufgabenstellung nach Javascript keinen Gefallen. Abgesehen davon, dass du damit darauf angewiesen bist, dass der Benutzer Javascript in seinem Browser zulässt.
Schönes Wochenende,
Martin
Ich möchte es gerne teilweise auf JS portieren. Also jeder Schleifendurchlauf des PHP Script liefert ein Ergebnis, das soll dann an das js geschickt werden, die daten Ausgeben, etwas pause einlegen und sich dann das nächste ergebnis vom PHP script holen (oder das PHP Script mit neuen Parametern aufrufen).
Auf anhieb fällt mir aber nicht ein wie man automatisch ein PHP script mit java lädt bzw. ein Javacript aus PHP(ohne benutzer einwrikung bis alles abgearbeitet ist).
Als übergabewerte kann man ja $_GET $_POST oder versteckte Formularfelder benutzen. Aber wie lädt man die Scripts automatisiert?
Gruß,
Jan
Hallo Jan,
Ich möchte es gerne teilweise auf JS portieren.
jetzt, wo ich den Eindruck habe, dass ich so langsam die Tragweite deines Projekts erkenne, hab ich eine andere Idee; ich versuche mal, sie zu erklären.
Also ein PHP-Script soll ein Dokument aus mehreren Abschnitten erzeugen, die Generierung jedes Abschnitts dauert aber relativ lange. Der Besucher soll außerdem, wenn's geht, die schon behandelten Abschnitte bereits sehen können.
Beim ersten Aufruf des Scripts wird eine Session gestartet, der erste Abschnitt des Dokuments erzeugt. Den fertigen Quelltext dieses ersten Abschnitts speichert es in der Session, sendet ihn aber gleichzeitig als fertiges HTML-Dokument an den Client. Im head-Element steht eine meta-Weiterleitung, die dasselbe Script erneut aufruft.
Beim zweiten Aufruf nimmt das Script die bisher in der Session gespeicherten Abschnitte, fügt den nächsten Abschnitt dazu, speichert das Ergebnis wieder in der Session und schickt es als komplettes HTML-Dokument an den Client.
Und so weiter, bis alle Abschnitte bearbeitet sind. Im letzten Schritt bleibt einfach die Weiterleitung weg.
Die Realisierung ist sicher aufwendig. Aber sie hat den Vorteil, dass das Script immer nur eine vergleichsweise kurze Laufzeit hat, und der Besucher kann das, was schon fertig ist, wenigstens schon sehen. Lästig ist allerdings, dass das Dokument dann bei jedem neu hinzugeladenen Abschnitt wieder an den Anfang springt - aber das kann man eventuell lösen, indem man auf jeden Abschnitt im Dokument einen Anker setzt und jeweils den letzten davon automatisch anspringt. Dann sieht es so aus, als ob das Dokument nach und nach geladen wird und automatisch weiterscrollt, wenn nötig.
Auf anhieb fällt mir aber nicht ein wie man automatisch ein PHP script mit java lädt bzw. ein Javacript aus PHP(ohne benutzer einwrikung bis alles abgearbeitet ist).
Bei diesem Lösungsansatz könnte wieder das AJAX-Konzept ins Spiel kommen. Das Javascript fordert per XmlHttpRequest() die dynamisch generierten Teile an, einen nach dem anderen. Jedesmal, wenn das Ergebnis eines Requests fertig empfangen ist, wird es in den DOM-Elementbaum eingehängt und dann der nächste Teil auf die gleiche Weise angefordert.
Einfacher ist das sicher nicht, und es setzt voraus, dass deiner Besucher Javascript aktiviert haben. Der Vorteil ist aber, dass man den Ladevorgang weniger sprunghaft und damit unauffälliger gestalten kann.
Ciao,
Martin
Der erste Lösungsansatz hört sich gut an.
Werde mich gleich nach dem deutschen 6:0 gegen schweden ranmachen :-) .
Gruß,
Jan
Fürs 6:0 hats denn doch nicht gereicht, 2:0 is jau auch ok.
Nun hab ich das mit den Sessions und dem direkten verweis auf das php script probiert. Funktioniert auch soweit, nur hab ich noch ein problem mit den Ankern.
»»<?
»»session_start();
»»$_SESSION["wert"]++;
»»$_SESSION["ueb"]= $_SESSION["ueb"]."<q id='".$_SESSION["wert"]."'>".$_SESSION["wert"]."</q><br>";
»»echo "<html>";
»»echo "<head>";
»»//echo "<meta http-equiv='Refresh' content='0.5; »»URL=session.php#".$_SESSION["wert"]."'>";
»»echo "<meta http-equiv='Refresh' content='0.5; URL=session.php'>";
»»echo "</head>";
»»echo "<body>";
»»echo $_SESSION["ueb"]."<br>";
»»echo "</body>";
»»echo "</html>";
»»?>
Die auskommentierte Zeile verweist immer auf den letzten anker bzw. die höchste Zahl. Das Script läuft dann aber nicht von alleine Weiter.
Jemand eine idee, wie ich immer den aktuellsten Wert mit Hilfe eines Ankers anzeige, das Script, bzw. die Html datei aber trozdem weiterläuft?
Gruß,
Jan