PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Domain auslesen mit RegEx



LogicalLimit
07.09.2006, 14:51
Heyho!
Ich bekomms irgendwie nicht hin... :(
Habe einige Strings in denen URLs stehen. Von diesen Strings möchte ich nur die Domain haben! Zur Zeit mache ich das so:


$HostHelp = split("http:\/\/.*/", $URL);
if($Horst[1]<> "")
{
$Host = substr($URL, 0, strpos($URL, $HorstHelp[1]));
}
else
{
$Host = "http://localhost/";
}

1) Wenn jemand ne elegantere Lösung weiß, immer her damit :D
ansonsten 2) als Beispiel die domain http://domain.de wird nach dem Suchmuster oben nicht erkannt und als domain wird der localhost angegeben.
Anderes Beispiel: http://www.seite.de/info/index.htm
Da wird bis zum letzten / eingelesen, also http://www.seite.de/info/!

Kann mir jemand helfen den RegEx so zu schreiben dass es so funktioniert, wie ich mir das wünsche? :D
Wär echt nett...

Gruß, LogicalLimit

Xanti
07.09.2006, 15:02
Eine Möglichkeit wäre:



($Host) = $URL=~m!(http://.*?)(/|$)!;


Gruss, Xanti

LogicalLimit
07.09.2006, 15:13
Hi! Danke schonmal für die Antwort, aber da kommt leider n Fehler :(

Parse error: syntax error, unexpected '=' in /generate.php on line 31

Gruß, LogicalLimit

Xanti
07.09.2006, 15:18
Hmm, also gehts um php. Probier mal



$URL=~m!(http://.*?)(/|$)!; $Host=$1;

LogicalLimit
07.09.2006, 15:23
Oh, sorry! Ganz vergessen dazu zu schreiben :D
Ja, es ist PHP und die beiden neuen codes funktionieren auch nicht :(

Parse error: syntax error, unexpected '!' in /generate.php on line 32

Habe auch ehrlich gesagt noch nie etwas von diesen ~s! und ~m! für PHP gelesen... Was sind das für Befehle?

Gruß, LogicalLimit

Xanti
07.09.2006, 15:30
m/ und s/ sind matchen und ersetzen in Perl (den zweiten Befehl hab ich wieder gelöscht, da er nicht richtig funktionierte). Dabei ist das Zeichen nach m oder s frei wählbar, zumindest in Perl. Da es in php wahrscheinlich nicht so ist, probier mal:



$URL=~/(http:\/\/.*?)(\/|$)/; $Host=$1;


Wenn das nicht funktioniert, muss jemand mit php-Kenntnissen einspringen, denn die hab ich nicht :D

Zumindest den regulären Ausdruck könntest Du verwenden.

LogicalLimit
07.09.2006, 16:08
Hi!
Hat leider auch nicht geklappt :D
Aber dennoch vielen Dank für deine Bemühungen! Wenn ich den Ausdruck benutze meldet PHP immer etwas von einem ungültigen Regulären Ausdruck...
Warning: split() [function.split]: REG_BADRPT in /generate.php on line 21
Habe allerdings bei meinem Ausdruck noch n Fehler gefunden, aber auch dessen Behebung hat nicht den gewünschten Erfolg gebracht :(

Nochmals vielen Dank und Gruß,
LogicalLimit

Wolfgang
07.09.2006, 18:08
Hallo

Ja php kennt leider nicht so einen lässigen sed-ähnlichen Umgang mit regulären Ausdrücken wie perl.
Deshalb suchst du eventuell nach eingebauten php-Funktionen wie preg_replace oder ereg_replace.
Nun bin ich auch jemand, der seine WEB oder Shell Probleme mit Perl statt php löst, deshalb nur diesen Tipp ohne direkte Lösung.



<?php
$zeichenkette = 'http://www.domain.de/path/';
$suchmuster = '/http:\/\/(w*\.([^/]+)\//i';
$ersetzung = '$1';
echo preg_replace($suchmuster, $ersetzung, $zeichenkette);
?>

Ungetestet müsste dabei die Domain ohne www herauskommen.
Allerdings liefert preg_replace den gesamten String zurück, wenn nicht gematcht wurde.
Dafür gibt es IMHO in php ereg bzw eregi.



<?php
if (eregi("^http:\/\/(w*)\.([^/]+)\/", $URL, $referenc)) {
$hoatname=""$referenc[2]";
} else {
echo "kein Regexp hat gematcht";
}
?>


Ungetestet, da hier kein PHP läuft und ich PHP nur sehr rudimentär behandle weil ich es nicht brauche.
Die von mir verwendete Regexp-syntax ist perlkompatibel, ob es deine PHP-Version so kennt weiss ich nicht.
Hoffe es hilft trotzdem weiter, wenn du dein PHP-Handbuch zu Hilfe nimmst.


Gruß Wolfgang

LogicalLimit
08.09.2006, 09:32
Vielen Dank!
Hat allerdings nicht so ganz geklappt. Zumal die Seiten nicht immer ein www. beinhalten.
Aber ich habe jetzt die Lösung gefunden: "http:\/\/[^\/]*\/".
Damit geht es genau so wie ich es mir vorgestellt habe :)
Vielen Dank nochmal an alle beteiligten!

Gruß,
LogicalLimit