| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

19-06-2009, 14:45
|
|
mgutt
Registrierter Benutzer
|
|
Registriert seit: May 2006
Beiträge: 73
|
|
<body>(.*)</body> aus HTML extrahieren
Hi,
komme ich damit klar, wenn ich den Quelltext einer Seite auf den Body reduzieren möchte oder muss ich noch irgendwas besonderes berücksichtigen?
Code:
$src = preg_replace('#<html.*<body.*>(.*?)</body.*>.*</html.*>#Uis', '\\1', $src);
Ich habe den Wert in den Klammern greedy gemacht, da es theoretisch sein kann, dass durch einen Fehler zwei <body>'s auf der Seite sein könnten. Hatte ich schon mal bei einem Kunden gesehen, weil der ein CMS hatte, dass einfach HTML-Seiten als Content includierte und die Seite ging trotzdem.
EDIT: Hmm.. ersetzt der dann das zwei mal oder nur einmal? Also was macht der aus:
Code:
<html>
<head>
</head>
<body>
Inhalt 1
<html>
<head>
</head>
<body>
Inhalt 2
</body>
</html>
</body>
</html>
Muss ich wohl mal testen...
EDIT2:
Ok daraus wird:
Code:
Inhalt 1
<html>
<head>
</head>
<body>
Inhalt 2
</body>
</html>
Das ist schlecht :P
EDIT3:
Ich denke ich lösche danach noch mal alle <html>, <head> und <body> Bereiche. Dann dürfte das klappen. Ich will nämlich Inhalt2 nicht haben.
Gruß
Marc
Geändert von mgutt (19-06-2009 um 14:59 Uhr)
|

19-06-2009, 14:46
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von mgutt
komme ich damit klar
|
Weiss nicht - sag's uns ...
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

19-06-2009, 23:31
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von mgutt
Hi,
komme ich damit klar, wenn ich den Quelltext einer Seite auf den Body reduzieren möchte oder muss ich noch irgendwas besonderes berücksichtigen?
Code:
$src = preg_replace('#<html.*<body.*>(.*?)</body.*>.*</html.*>#Uis', '\\1', $src);
Ich habe den Wert in den Klammern greedy gemacht, ...
|
Lazy wäre wohl richtig gewesen ...
Aber man kommt schnell durcheinander, wenn man den Verdreh-Modifikator /U benutzt. Deshalb lasse ich den gewöhnlich weg, und schreibe lieber ein paar Fragzeichen mehr in den RegEx.
Du solltest zum "Ausschneiden" eines Teilstrings besser die passende Funktion benutzen. Preg_replace() hat (u. A.) den Nachteil, dass du den ganzen Originalstring bekommst, wenn dein RegEx nicht passt.
PHP-Code:
$part = preg_match('/<html.*?<body.*?>(.*?)<\/body.*?>.*?<\/html.*?>/is', $html_src, $hits)
? $hits[1] : '';
Zitat:
|
da es theoretisch sein kann, dass durch einen Fehler zwei <body>'s auf der Seite sein könnten. Hatte ich schon mal bei einem Kunden gesehen, weil der ein CMS hatte, dass einfach HTML-Seiten als Content includierte und die Seite ging trotzdem.
|
Ja, die HTML-Parser der gängigen Webbrowser sind schon arme Schweine. Die müssen auch den größten Unfug in irgendwie darstellbare Form bringen.
Zitat:
|
Ich denke ich lösche danach noch mal alle <html>, <head> und <body> Bereiche. Dann dürfte das klappen. Ich will nämlich Inhalt2 nicht haben.
|
Siehe mein Vorschlag ...
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
Geändert von fireweasel (19-06-2009 um 23:39 Uhr)
|

20-06-2009, 01:12
|
|
mgutt
Registrierter Benutzer
|
|
Registriert seit: May 2006
Beiträge: 73
|
|
Zitat:
Zitat von fireweasel
Lazy wäre wohl richtig gewesen ...
Aber man kommt schnell durcheinander, wenn man den Verdreh-Modifikator /U benutzt. Deshalb lasse ich den gewöhnlich weg, und schreibe lieber ein paar Fragzeichen mehr in den RegEx.
|
Ich nicht und wenn Du noch mal hinschaust, siehst Du, dass er Greedy ist. Ich arbeite beim body genauso wie der Browser. Der nimmt nur die äußeren Tags. Dein preg_match()-Beispiel dagegen die inneren Tags, wodurch ein eingebettes HTML zum vorzeitigen Abbruch der Verarbeitung führt und alles was nach dem eingebetteten HTML kommt wird dadurch ignoriert. Der Browser dagegen stellt auch noch das alles dar, weil er gar nicht nach einem Ende sucht. Daher hat google.de auch keine endenden body- und html-Tags.
Zitat:
|
Du solltest zum "Ausschneiden" eines Teilstrings besser die passende Funktion benutzen. Preg_replace() hat (u. A.) den Nachteil, dass du den ganzen Originalstring bekommst, wenn dein RegEx nicht passt.
|
Was Du als Nachteil bezeichnest, sehe ich als Vorteil und ich würde die Argumentation auch vollkommen umdrehen, da ich nichts ausschneiden möchte, sondern löschen (den Kopf und den Fuß). Du löschst den Quellcode weiterhin komplett, wenn nichts gefunden wurde.
Ich will aber - bei nicht vorhandenen html- und body-Tags - das haben was übrigt bleibt, weil man dann davon ausgehen muss, dass der Webmaster die entsprechenden Tags weggelassen hat. Weiterhin ist preg_replace() performanter, da es ohne eine zusätzliche Bedingung und ohne ein zusätzliches Array auskommt.
|

20-06-2009, 01:14
|
|
mgutt
Registrierter Benutzer
|
|
Registriert seit: May 2006
Beiträge: 73
|
|
Zitat:
Zitat von wahsaga
Weiss nicht - sag's uns ...
|
Damit wollte ich auf bestimmte Eventualitäten anspielen, die ich selbst vielleicht nicht bedacht habe.
Ich habe z.B. die Groß- und Kleinschrift ignoriert und berücksichtigt, dass nach einem öffnenden Tag noch weitere Zeichen folgen könnten. Vielleicht gibts ja noch was, was ich vergessen habe.
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|