• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Regulärer Ausdruck für einen Zeilenumbruch

Mo3b

Mitglied
Hi,
ich möchte einen String durchsuchen:

Code:
function get_body($page)
{
    $pattern='~^(<body>).*(</body>)$~Us';
    preg_match($pattern, $page, $matches, PREG_OFFSET_CAPTURE);
    return $matches[0][0];
}

Das ganze funktioniert leider nicht mehr wenn ich einen Zeilenumbruch drin habe. Kann mir wer da helfen?

Mfg Mo3b
 
Wenn ich die Modifyer richtig in Erinnerung habe müsste das "s" weg und anstelle dessen ein "m" hin.
 
wenn ich mich richtig erinner ist ein regulärer ausdruck für eine solche aufgabe viel zu übertrieben! ;)

PHP:
function filterBody($text) {
	$p1 = strpos($text, '<body>');
	$p2 = strpos($text, '</body>');
	if($p1 !== false && $p2 !== false) {
		return substr($text, $p1 + 6, $p2 - $p1 - 6);
	}
	return false;
}

es gibt in einem html dokument eh nur jeweils einen body tag also ist das einzige was wir zusätzlich brauchen eine kontrlle ob tags da sind also gibt unsere funktion false zurück wenn nichts zu tun ist und sonst den text zwischen <body> und </body>

mfg ;)
 
Und damit uns allen die Erinnerung zu den Modifiern wiederkommt:

Code:
e (interpretiert Ersatzstring)
i (Groß- und Kleinschreibung ignorieren)
m (^ und $ über mehrere Zeilen)
s (akzeptiert Zeilenumbruch als Zeichen)
S (Ausführung steigern)
U (Gier unterdrücken)
x (Whitespace im Muster ignorieren)
u (UTF-8 interpretiert)

;)

"m" dürfte das Problem lösen, wie crash schon beschrieben hat! Das "s" muss aber bleiben, damit der . Zeilenumbrüche akzeptiert!

Ob jetzt Slibbos Lösung besser ist (sollten Reg. Ausdr. wirklich übertrieben sein), kann ich nicht beurteilen!
 
bei einer so großen menge an daten wie sie von einer homepage kommen können brauch man nicht viel nachdenken was schneller ist denn selbst bei wesentlich kleineren sachen währe eine solche funktion wie diese hier schneller.
 
So nun melde ich mich auch mal wieder :)

@Slibbo: Deine Funktion werde ich wahrscheinlich nehmen, ich möchte aber trotzdem mal versuchen das ganze mit Regex zu lösen. Das ist eine gute Übung für mich. :)

Ich habe ein bisschen rumgespielt und das herausgefunden:

Wenn ich die Modifikator s UND m verwende, dann klappt dieser Ausdruck:

Code:
$pattern='~(<body>).*(</body>)~ism';

Hier habe ich ^ und $ weggelassen. Nur wenn ich das weglasse klappt meine Abfrage auch wenn etwas vor und nach dem body-tag steht. Ich denke ich habe das falsch verstanden. Wenn ich also nach ^<body> suche, so muss das innerhalb des Strings pattern zuallererst stehen?

Ach ja, danke für all eure Antworten :)
Mfg Mo3b
 
bei einer so großen menge an daten wie sie von einer homepage kommen können brauch man nicht viel nachdenken was schneller ist denn selbst bei wesentlich kleineren sachen währe eine solche funktion wie diese hier schneller.

Nun ich habe das Ganze mal getestet für eine Seite mit 100 Zeilen html-Code. Ich habe beide Methoden (Regex und substr-Funktion) getestet.

Dafür habe ich eine Schleife über die kritischen Parts mit 10000 Durchläufen verwendet.

Ich bekomme bei beiden Methoden einen Wert von 0,15 Sekunden heraus. (Schwankungen sind vorhanden,aber im Schnitt nicht relevant)

Somit sind beide Methoden für zumindest Seitenmit etwa 100 Zeilen COde gleich schnell/langsam ;)

Mfg Mo3b
 
Code:
miah@miah-desktop:~$ php Desktop/test.php
getBody();
time: 4.62534809113
d   : 0.000462534809113
filterBody();
time: 2.90496397018
d   : 0.000290496397018
miah@miah-desktop:~$ php Desktop/test.php
getBody();
time: 4.87295484543
d   : 0.000487295484543
filterBody();
time: 2.62719202042
d   : 0.000262719202042
miah@miah-desktop:~$ php Desktop/test.php
getBody();
time: 4.80952119827
d   : 0.000480952119827
filterBody();
time: 2.76018404961
d   : 0.000276018404961

meine ergebnisse sagen was anderes ^^

PHP:
<?php

$page = file_get_contents('http://www.html.de/php/26272-regul-rer-ausdruck-f-r-einen-zeilenumbruch.html');

$a = 0.1;
$e = 0.1;

$a = microtime(true);
for($i = 0; $i < 10000; $i++) {
	getBody($page);
}
$e = microtime(true);
echo "getBody();\n";
echo "time: ".($e - $a)."\n";
echo "d   : ".(($e - $a) / 10000)."\n";

$a = microtime(true);
for($i = 0; $i < 10000; $i++) {
	filterBody($page);
}
$e = microtime(true);
echo "filterBody();\n";
echo "time: ".($e - $a)."\n";
echo "d   : ".(($e - $a) / 10000)."\n";


function getBody($page) {
	$pattern='~(<body>).*(</body>)~ism';
	if(preg_match($pattern, $page, $matches, PREG_OFFSET_CAPTURE)) {
		return $matches[0][0];
	}
	return false;
}


function filterBody($text) {
	$p1 = strpos($text, '<body>');
	$p2 = strpos($text, '</body>');
	if($p1 !== false && $p2 !== false) {
		return substr($text, $p1 + 6, $p2 - $p1 - 6);
	}
	return false;
}

wenn ihr selber testen wollt und die datei nicht über die konsole / das terminal aufruft sondern im browser empfehle ich euch die \n durch <br /> zu ersetzen oder vor und nach dem code einen <code> tag auszugeben.
 
Zurück
Oben