Tom: RegEx

Hallo!
Ich habe leider keine Ahnung von regulären Ausdrücken, kann mir vielleicht jemad kurz & schmerzlos helfen?!

Ich habe in meinem Gästebuch eine RegEx, die überprüfen soll, ob eine Homepage-Adresse mit, oder ohne "http://" eingegeben wurde bzw. die das "http://" abschneiden soll. Diese sieht so aus:

preg_match("/^(http://)?([^/]+)/i", $hp, $matches); $hp = $matches[2];

Nun schneidet sie aber auch Dateien oder Verzeichnisse (z.B. www.xyz.de/xyz/xyz.html) ab. Das will ich aber gar nicht!

Danke!
TOM

  1. Hi!

    Ich habe leider keine Ahnung von regulären Ausdrücken, kann mir vielleicht jemad kurz & schmerzlos helfen?!

    Na klar! http://www.koehntopp.de/php/regexp.html

    Gruss sven

    1. hallo Sven

      Na klar! http://www.koehntopp.de/php/regexp.html

      zweifellos eine gute Adresse. Um Tom ein paar schmerzliche Erfahrungen mit dieser Adresse zu ersparen, hättest du ihn aber besser auf http://www.php.net/manual/en/function.preg-match.php hinweisen sollen ;-)

      das Interessante an regulären Ausdrücken ist, daß sie fast unterschiedslos in verschiedenen "Sprachen" vorkommen können  -  Javascript, PHP, Perl, TCL, JAVA, ruby, Python, C/C++ ... es mag auch eine Geste sein, hier im Forum auf http://selfhtml.teamone.de/cgiperl/sprache/regexpr.htm zu verweisen. Der Ausdruck "preg_match()" kommt allerdings da nicht vor, obwohl es sich um einen PERL-kompatiblen Ausdruck handelt.

      zum angesprochenen Problem: Tom sollte einfach probieren, ob "preg_match()" der korrekte Ausdruck für die Aufgabenstellung ist. Denn: "preg_match() returns an integer type rather than a boolean. There ist the meaning, that it only returns true/false ... And so You have to cast it to boolean if you want to use the result in a overloaded (by type) function". So weit ich das sehe, passiert das von Tom bemängelte "Abschneiden" ganz einfach dadurch, daß der zu untersuchende string einschließlich des regulären Ausdrucks nicht korrekt formuliert ist. Und er macht sich seine Aufgabe überhaupt viel zu schwer.

      Tom möchte doch lediglich überprüfen, "ob eine Homepage-Adresse mit, oder ohne 'http://' eingegeben wurde" und bei Bedarf "das 'http://' abschneiden". Dazu braucht man gar keinen regulären Ausdruck. Dafür reicht eine "if ... else"-Abfrage, und das läßt sich doch noch etwas leichter bewerkstelligen als eine Konstruktion unter Zuhilfenahme eines regulären Ausdrucks. Das Konstrukt sähe dann generell so aus:

      if ($Variable_der_Homepage = http://pfad/zur/HP)
      preg_replace ("http:// abschneiden")

      nur hätte man damit den Teufel mit Beelzebub ausgetrieben, und statt des einen regulären Ausdrucks einen anderen genommen

      ganz ohne regulären Ausdruck geht es so:
      if ($Variable_der_Homepage = http://pfad/zur/HP): /*muß ntürlich korrekt formuloert werden*/
       $hp = $Variable_der_Homepage;
       $hp_neu = substr($hp,6);

      dann enthält die Variable $hp_neu die Homepage-Adresse ohne das "http://" und kann entsprechend weiter verarbeitet werden, z.B. mit "echo"

      mit regulären Ausdrücken zu arbeiten, gehört wohl in allen Scriptsprachen zur "hohen Schule" ;-) und wenn man am Anfang steht, sollte man nach Möglichkeiten suchen, sie wirklich nur dann einzusetzen, wenn es sich nicht anders machen läßt

      Grüße aus Berlin

      Christoph S.

      1. Hallo!

        ganz ohne regulären Ausdruck geht es so:
        if ($Variable_der_Homepage = http://pfad/zur/HP): /*muß ntürlich korrekt formuloert werden*/
        $hp = $Variable_der_Homepage;
        $hp_neu = substr($hp,6);

        Das ist 'ne gute Idee, danke! Ich habs jetzt so gemacht, das sollte doch funktionieren:

        if (substr($hp,0,7) == "http://") { $hp = substr($hp,7); }

        Grüße aus Berlin

        Grüße aus Freiburg
        TOM

        1. hi,

          Das ist 'ne gute Idee, danke! Ich habs jetzt so gemacht, das sollte doch funktionieren:
          if (substr($hp,0,7) == "http://") { $hp = substr($hp,7); }

          oh ,da hatte ich mich um eine Stelle verzählt *g*
          und funktionieren wird das wohl.

          Christoph S.