PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   Projekthilfe (https://www.php-resource.de/forum/projekthilfe/)
-   -   HTM-Dok mit PHP auseinandernehmen und in DB (https://www.php-resource.de/forum/projekthilfe/77417-htm-dok-mit-php-auseinandernehmen-und-in-db.html)

ThE_-_BliZZarD 28-10-2006 22:12

HTM-Dok mit PHP auseinandernehmen und in DB
 
Naja, ich mal wieder.

Diesmal folgendes:

1. Ein HTML-Dokument, welches (sehr schlecht gemacht ist, aber das war ich nicht und interessiert hier auch nicht, kann aber Syntaxfehler enthalten :( ) aus ein bisschen Text besteht und einer Tabelle der folgenden Form:
Zitat:

<tr>
<td class="oben"> 26.04.2006</td>
<td> <b>Dies ist die Überschrift</b>
<br>
BLA BLA BLA BLA BLA BLA -- viel Text --
</td>
</tr>
So, mal zum Format: das Datum aus dem"<td class="oben"> 26.04.2006</td>" will ich in die DB einlesen, also WICHTIG.
Das, was zwischen dem zweiten <td> und </td> steht, gehört nicht zusammen, muss aber auch in die DB. Die Überschrift MIT dem <b> (wenn eins da steht) soll als ein Element in die DB, und der Text danach, der IMMER mit einem <br> von der Überschrift abgegrenzt ist.

2. Ein PHP-Dokument, welches das HTML-Ding öffnen und einlesen soll^^

Mein Problem: Das PHP-Dokument fehlt xD.
Ich habe es versucht mit sehr vielen While's, Strpos() usw usw.. aber da ich zum Beispiel nie kapiert habe wie dieses behinderte ereg funktioniert (ka, niemand erklärt mal wies funktioniert, und die ANleitung bei PHP.net hat auch nicht geholfen) bekomme ich außer 500'er Fehlern nichts raus.

Könnte mir jemand ein Script schreiben, das einfach nur eine Tabelle (begrenzt durch zwei Strings, die einzeln in einer Zeile stehen und Anfang/Ende signalisieren) nimmt, und dann in eine DB haut? BITTE.
Ich weiß, is viel Hirnarbeit erforderlich, aber ich komm nicht mehr weiter, und habs schon lange probiert.. (6 Tage).

Marcusson 29-10-2006 09:57

Tz, wie soll dir jemand helfen, wenn wir nicht die komplette Syntax deiner Datei haben.

Versuch es mal mit Google und "Perl regular expressions" und preg_match() bzw. preg_replace(). Der Schreiben ist einfach nur Fleißarbeit. Text auslesen und Inserts zusammenbauen. Keine spannende Aufgabe - aber ohne die Syntax und die Sonderfälle zu kennen, kann man dir keinen passenden regulären Ausdruck anbieten.

Mal 'ne grundsätzliche Frage: Wenn's nur eine einzige Datei ist und du das sowieso nur einmal brauchst, warum machtst du es dann eigentlich nicht mal fix mit dem Texteditor? Ein guter Editor beherrscht auch regular expressions ;) Damit kann man sich ohne zu programmieren herrliche Inserts basteln.

ThE_-_BliZZarD 29-10-2006 17:08

hmm, sagen dir 40kb was? ^^ und es sind leider mehrere solche dateien.

werde mich noch mal dran setzen, aber, wegen dem Syntax: was meinst du damit? willst du wissen wie das genau aufgebaut ist?

PHP-Code:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<
html>
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<
title>New document</title>
</
head>
<
body>
bla bla bla
<table>
<!-- 
Info-Tabelle beginnt hierACHTUNGHINWEIS N I C H T ENTFERNEN! -->


<
tr>
<
td class="oben"26.04.2006</td>
<
td> <b>Dies ist die Überschrift</b>
<
br>
BLA BLA BLA BLA BLA BLA -- viel Text --
</
td>
</
tr>

<
tr>
<
td class="oben"27.05.2006</td>
<
td> <b>Dies ist die Überschrift</b>
<
br>
BLA BLA BLA BLA BLA BLA -- viel Text --
</
td>
</
tr>

<
tr>
<
td class="oben"16.06.2006</td>
<
td> <u>Dies ist die Überschrift</u>
<
br>
BLA BLA BLA BLA BLA BLA -- viel Text --
</
td>
</
tr>


<
tr>
<
td class="oben"14.04.2006</td>
<
tdDies ist die Überschrift
<br>
BLA BLA BLA BLA BLA BLA -- viel Text --
</
td>
</
tr>

<!-- 
Info-Tabelle endet hierACHTUNGHINWEIS N I C H T ENTFERNEN! -->
</
table>
</
body>
</
html


jmc 29-10-2006 21:07

preg_match_all("/<td class=\"oben\">[\ ]\d{2}\.\d{2}\.\d{4}<\/td>/i",$string, $dates)
for($a=0;$a<count($dates);$a++){
$dates[$a] = preg_replace("/<td class=\"oben\">[\ ](\d{2}\.\d{2}\.\d{4})<\/td>/i","$1",$dates[$a]);
}

die anderen kannst du nach dem selben Schema machen.

ich habe kein [PHP] benutzt, da sonst die Backslashes verschwinden.

Warum benutzt du für sowas eigentlich nicht XML?

ThE_-_BliZZarD 29-10-2006 21:30

ahh, endlich jemand mit skill *freu*

naja, XML? kann ich nicht/nur unzureichend.

mal was anderes: kann mir jemand erklären, wie dieser Syntax mit preg_replace und ereg funktioniert? ich hab die Erklärung auf PHP.net nicht wirklich verstanden, kann jemand vieleicht mal erleutern wie das funktioniert?

Zitat:

preg_match_all("/<td class=\"oben\">[\ ]\d{2}\.\d{2}\.\d{4}<\/td>/i",$string, $dates)
:confused: :confused: :confused: :confused:

Trotzdem DankE!!

jmc 29-10-2006 23:32

such unter wiki "pregexp"

highrise 31-10-2006 06:14

okay..

preg_match_all("/<td class=\"oben\">[\ ]\d{2}\.\d{2}\.\d{4}<\/td>/i",$string, $dates)

preg_match_all finde alle stellen in $string und merk sie dir in $dates (array), die wie folgt aussehen:

/ sogenannter delimiter... der sagt "hier gehts los".. , der am ende hingegen "hier ist schluss.. es folgen Modifier.. deshalb gehts nicht ohne, sonst würde das i ganz am ende falsch interpretiert.. das sagt nämlich.. scher dich einen dreck um groß- und kleinschreibung...

weiter im text..

also finde zeichenfolgen, die beginnen mit exakt:
<td class=\"oben\"> (die backslashes sind dafür da, dass er beim " nicht denkt, hier wär der sting zu ende, sondern diese als "-zeichen ansieht.. in wahrheit sucht er also <td class="oben">

jetzt kommt ne zeichenklasse... was die hier macht, weiß ich gerade nicht.. ein leerzeichen an dieser stelle hätte es auch getan *find*..
also wie auch immer.. eine zeichenklasse -> gefolgt von einem der zeichen zwischen den eckigen klammern (hier also leerzeichen, der backslash escaped das leerzeichen?? *wunder*.. ich bin verwirrt.. wer klärt mich mal auf.. ??)

gefolgt von nem leerzeichen
gefolgt von genau zwei ziffern, was vermutlich blödsinn ist... denn wir suchen ja auch tage von 1 - 9.. gefolgt von einem . (der . muss escaped werden mit \.. sonst stünde er für ein beliebiges zeichen) gefolgt von 2 ziffern gefolgt von einem punkt gefolgt von 4 ziffern gefolgt von genau <\/a>, wobei / durch \ escaped wird, weil es als delimiter verwendet wurde.


sooooo.. alle klarheiten beseitigt ;-) ???

greetz, high

jmc 31-10-2006 14:00

0 ist auch eine Dezimalzahl also \d{2} und kein Blödsinn.

Manche haben IgnorePatternWhitespace / x on als standardeinstellung --> whitespaces müssen explizit markiert werden. Die Zeichenklasse dient aus diesem Grunde der Übersicht damit klar ist was markiert ist.

highrise 31-10-2006 14:01

wundervoll.. das wollte ich wissen..

dass 0 ein decimal ist, ist klar.. aber was ist mit diesem format: 3.12.2006 (ohne führende null.. )

dan gehts nicht..

greetz, high

jmc 31-10-2006 17:31

wer beim Monat eine führende Null hat wird ja wohl diese beim Tag nicht weglassen ;)

highrise 31-10-2006 19:04

klingt logisch.. würde ich dir zustimmen, wenn ich den programmiere kennen würde..
allerdings ist logik keine garantie.. sogesehen, ist beim monat auch noch ein fehler im regex, denn der könnte ja ebenfalls ohne führende null da stehen... sicherer ist, beide zu fangen.. und gerade mal ein paar zeichen mehr regex..

greetz, high

jmc 31-10-2006 19:10

schau mal im Beispiel

highrise 31-10-2006 19:15

wenn du jetzt wirklich aus drei einzelnen einträgen auf ein ganzes file schließen willst, dann gute nacht.. ich hae es schon sooooo oft erlebt, dass dann wie der teufel es will mal wieder einige wenige einträge sich eben nicht an das beispiel halten.. sei es, weil sie aus ner früheren version stammen oder warum auch immer..
warum denn eine mögliche situation nicht abfangen, wenn es kaum mehr aufwand bedeutet, sondern sie einfach wegdiskutieren?
sotosay müsste man streng genommen auch nur drei exakte daten prüfen, weil andere im beispiel nicht enthalten sind.. anyway...
es macht gerade mal ein paar zeichen mehr..

ThE_-_BliZZarD 31-10-2006 20:06

Liste der Anhänge anzeigen (Anzahl: 1)
okay okay, wenn ihrs haben wollt^^
ich habe eigentlich alles durchgeguckt, und es war alles so, aber kann sein das ich mich irre..:cool:

habs mal angehängt.

highrise 31-10-2006 20:09

sooo.. in dem punkt sieht es wohl so aus, dass alle einstelligen daten tatsächlich eine führende null besitzen...

habe allerdings folgende zeile gefunden:

<td class="oben">01.01.2006</td>

da fehlt das leerzeichen.. ergo müssen wir da noch einmal korrigieren, und hinter [\ ] noch ein ? setzen (einmal oder kein mal)

greetz, high


Alle Zeitangaben in WEZ +2. Es ist jetzt 16:49 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG