ERLEDIGT
NEIN
NEIN
ANTWORTEN
6
6
ZUGRIFFE
1574
1574
EMPFEHLEN
-
Hallo!
Ich versuche gerade einen HTML Quelltext darauf zu überprüfen, ob mindestens zwei Dezimalzahlen oder zwei Brüche in der Form xx.xx bzw. xx/xx darin vorkommen.
Mein Problem Nr.1: Es sollen nur Zahlen der Form xx.xx, x.xx, xx.x, x.x im Ergebnis auftauchen, nicht aber xxx.x oder x.xxx etc., also nur je zwei Stellen vor oder nach dem . bzw. /.
Mein Problem Nr.2: Der Quelltext enthält teils verschachtelte Tabellen, und ich will nur diejenigen herausfiltern, die eine Zahl (xx.xx od. xx/xx - siehe Frage1) enthalten.
Etwa:
<table>
<tr>
<td>Irgendwas</td>
<td>
<table>
<tr>
<td>xyz</td>
<td>xx.xx</td>
</tr>
</table>
</td>
<td>Irgendwas</td>
</tr>
</table>
und ich will nur das haben:
<table>
<tr>
<td>xyz</td>
<td>xx.xx</td>
</tr>
</table>
Hier ist das was ich bisher habe, aber dabei werden auch Zahlen der Form x.xxx im Ergebnis als x.xx (die ja in x.xxx enthalten ist) berücksichtigt.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
// Einlesen der zu untersuchenden Datei $content = file_get_contents($file); // Umwandeln des Inhalts in Kleinbuchstaben $content = strtolower($content); // Umwandeln aller HTML Sonderzeichen in ASCII $content = html_entity_decode($content); // Entfernen aller JavaScript Bereiche $content = preg_replace("'<script[^>]*?>.*?</script>'si", "", $content); // Entfernen aller PHP und HTML Tags außer <(/)table>, <(/)tr>, <(/)td> $content = strip_tags($content, "<table></table><tr></tr><td></td>"); // Entfernen der Variablen in HTML Tags //Suche <table ...> und überschreibe mit <table> $content = preg_replace("'<table[^>]*?>'", "<table>", $content); //Suche <tr ...> und überschreibe mit <tr> $content = preg_replace("'<tr[^>]*?>'", "<tr>", $content); //Suche <td ...> und überschreibe mit <td> $content = preg_replace("'<td[^>]*?>'", "<td>", $content); // Prüfung auf mindestens zwei Zahlen in der Form xx.xx oder xx/xx preg_match_all("'\d{1,2}(\.|/)\d{1,2}'", $content, $treffer); $treffer2 = count($treffer[0]); echo $treffer2."<br>"; for ($i=0; $i< count($treffer[0]); $i++) { echo "Treffer 1: ".$treffer[0][$i]."<br>"; echo "Treffer 2: ".$treffer[1][$i]."<br>"; } // Reduzieren des Inhalts auf Tabellen die xx.xx|xx/xx enthalten preg_match_all("'<table>(.*)(\d{1,2}(\.|/)\d{1,2})(.*)</table>'", $content, $treffer); $treffer2 = count($treffer[0]); echo $treffer2."<br>"; for ($i=0; $i< count($treffer[0]); $i++) { echo "Treffer 1: ".$treffer[0][$i]."<br>"; echo "Treffer 2: ".$treffer[1][$i]."<br>"; } // Ausgabe des Ergebnisses echo $content;
Leider arbeite ich zum Ersten mal mit den preg_... - Funktionen und durch herumprobieren bin ich einfach nicht weitergekommen ...
Vielen Dank für Eure Tips und/oder Hilfen!
Grüße
Martin
-
Es geht auch einfacher:
PHP-Code:<?php
if( preg_match_all('/[0-9]+(?:\x2E|\x2F)[0-9]+/', $string, $matches) ) {
$matches = $matches[0];
echo '<pre>';
print_r($matches);
echo '</pre>';
}
?>
-
Ich persoenlich finde die Ausgabe von print_r nicht so berauschen und nutze dafuer lieber folgenden Code:
Ich find's einfach uebersichtlicher jeden Wert des Arrays in einer neuen Zeile zu haben.PHP-Code:printf(nl2br(print_r($matches,true)));
PHP Class Collection - PHP-Klassen fuer PHP 5 (und Teilweise auch fuer PHP 4)
Updates: Catcher 1.1, FTPConnection 1.2, MultiSQL 1.1, RSS2 1.1, SMTPConnection 1.4
__________________
EasyLFS - Hintergrundinformationen, Installationsanleitung, Softwareliste und Download
EasyLFS Projektthread - Informationen, Status und Diskussion zu meiner Linux-Distribution
__________________
__________________Ich bin die Schildkroete, mein Sohn. Ich habe das Universum erschaffen, aber bitte mach mir daraus keinen Vorwurf; ich hatte Bauchschmerzen.
Zitat von Friedrich Nietzsche
-
Hallo!
Ersteinmal Danke für Eure Tipps.
Habe jetzt meinen Code auf
Code :1 2 3 4 5 6 7 8
// Prüfung auf mindestens zwei Zahlen in der Form xx.xx oder xx/xx if (preg_match_all('/([0-9]+(?:\x2E|\x2F)[0-9]+)/', $content, $matches)) { $matches = $matches[0]; echo '<pre>'; printf(nl2br(print_r($matches,true))); echo '</pre>'; }
geändert.
Mein Problem besteht aber weiterhin, denn Werte die drei- oder mehrstellig vor oder hinter dem Punkt sind, werden im Ergebnis berücksichtigt.
Habe es in einer zweiten if Abfrage mit
Code :1 2 3 4 5 6 7 8 9 10 11
// Prüfung auf mindestens zwei Zahlen in der Form xx.xx oder xx/xx if(preg_match_all('/([0-9]+(?:\x2E|\x2F)[0-9]+)/', $content, $matches)) { if (!preg_match_all('/([0-9]{3,}(?:\x2E|\x2F)[0-9]{3,})/', $content, $matches)){ $matches = $matches[0]; echo '<pre>'; printf(nl2br(print_r($matches,true))); echo '</pre>'; } }
versucht, dann bleibt das Ergebnis aber leer.
Die Klammer {3,} bedeutet doch, dass mindestens drei Ziffern von 0-9 vorhanden sein müssen und mit "!" vor preg_match_all negiere ich das dann. Folglich kommt das Skript nicht in die innerste Schleife, wenn mehr als drei Ziffern vor oder nach dem . bzw. / vorhanden sind.
Funktioniert aber nicht
Grüße
Martin
-
Probier mal Folgendes:
PHP-Code:<?php
if( preg_match_all('/[^0-9][0-9]{1,2}(?:x2E|\x2F)[0-9]{1,2}/', $string, $matches) ) {
$matches = $matches[0];
echo '<pre>';
print_r($matches);
echo '</pre>';
}
?>
-
Hallo!
Originalwerte:
1.70
444.00
35.555
01/800
1.65
Das [^0-9] bewirkt, dass im Ergebnis das letzte Zeichen (>) vor der Zahl mit im Ergebnis ausgegeben wird und die 444.00 wird geschluckt, da erstes Zeichen nicht aus [0-9]
[11] => >1.70
[12] => >35.55
[13] => >01/80
[14] => >1.65
Wenn ich den Ausdruck in
abändere, dann wird das Ergebnis schon ziemlich gut. Alle Werte die raus müssen sind raus, allerdings wird das Ergebnis von dem Zeichen davor und danach "eingerahmt".Code :1
preg_match_all('/[^0-9][0-9]{1,2}(?:\x2E|\x2F)[0-9]{1,2}[^0-9]/', $content, $matches)
[11] => >1.70<
[12] => >1.65<
Trotzdem schon mal vielen Dank!
Martin
-
Hallo!
Frage 1 gelöst!
Code :1
preg_match_all('/(?<![0-9])\d{1,2}(?:\x2E|\x2F)\d{1,2}(?![0-9])/', $content, $matches)
Und das Zauberwort heißt "Assertions".
Jedem der mit Regular Expressions zu kämpfen hat, kann ich dieses kleine Helferlein empfehlen:
http://weitz.de/regex-coach
Grüße
Martin
Ähnliche Themen
-
Filtern über zwei tabellen
Von peper im Forum Visual Basic 6.0Antworten: 1Letzter Beitrag: 13.10.08, 07:56 -
HTML-Code filtern?
Von Miraculixx im Forum PHPAntworten: 9Letzter Beitrag: 04.08.05, 15:18 -
HTML Filtern Problem
Von proloser im Forum PHPAntworten: 6Letzter Beitrag: 27.08.04, 14:54 -
Inhalt aus bestimmten html tags ausfiltern - preg_match_all
Von Rios im Forum PHPAntworten: 9Letzter Beitrag: 09.12.03, 00:12 -
html filtern und datumssotierung
Von Rev im Forum PHPAntworten: 3Letzter Beitrag: 02.01.02, 16:58





Zitieren
Login






[PHP][Snippet] Array zu XML konvertieren