$xNeTworKx: reg. Expr. gesucht ?

Hallo,
ich versuche jetzt schon ziemlich lange vergebens einen regulären Ausdruck zu finden, der Links entdeckt. Mein momentaner Stand sieht so aus :

if ($changetext =~ /(http://[A-Za-z0-9._-%&?/]+?)/ig)   {
  my $tag = "<span class="farbmarkierung">$1</span>";
  $changetext =~ s/$1/$tag/;
  }

Er findet nur http://w  .
Und 2. würde ich noch gerne wissen, wie ich diese Schleife am Besten schreiben kann, dass ich nicht $1 verwenden muss, weil wenn ich zB $changetext statt $1 in der 2. Zeile einsetzt und die Klammern weglasse, kopiert er nachher irgendwie den Text ab der gefundenen Stelle und fügt ihn am Schluss wieder dran.
wenn ich überhaupt die $tag Zeile weglasse und direkt $1 mit <span...>$1</span> ersetze, schneidet er mir einfach des Gefundene weg.
Ich frage deswegen weil den ganzen Ausdruck einklammern ist ja wohl ziemlich uneffizient, aber wie gesagt, wenn ich $changetext direkt verwende, bekomme ich den Text plötzlich 2 Mal.
Was kann ich tun ?

$xNeTworKx.

  1. Hi Andreas,

    was ist denn in $changetext enthalten ? Wenn's HTML ist, suche doch vom ersten Anführungsstrich des href-Attributes bis zum nächsten also
    =~ /"https?://.+?"/

    Gruss
    Egon

    1. Hi,

      was ist denn in $changetext enthalten ? Wenn's HTML ist, suche doch vom ersten Anführungsstrich des href-Attributes bis zum nächsten also
      =~ /"https?://.+?"/

      Nein, es ist hauffenweise reiner Text, der Eingabetext eines Forums, um genau zu sein. Perl soll nach Links suchen, die NICHT zwischen [link]http://www.blabla.com[/link] stehen.

      $xNeTworKx.

      1. Hi,

        was ist denn in $changetext enthalten ? Wenn's HTML ist, suche doch vom ersten Anführungsstrich des href-Attributes bis zum nächsten also
        =~ /"https?://.+?"/

        Nein, es ist hauffenweise reiner Text, der Eingabetext eines Forums, um genau zu sein. Perl soll nach Links suchen, die NICHT zwischen [link]http://www.blabla.com[/link] stehen.

        $xNeTworKx.

        Mmmhh, also ist das Ende des Links zu definieren. Da würd' ich nach einem Leerzeichen suchen.
        =~ /(https?://.+? )/;
        Egon

        1. Hi,

          Mmmhh, also ist das Ende des Links zu definieren. Da würd' ich nach einem Leerzeichen suchen.
          =~ /(https?://.+? )/;

          Ja, aber es sollen nur Zeichen vorkommen, die ein Link auch tatsächlich beinhalten kann, also zB kein @ ^ ! usw.

          $xNeTworKx.

  2. Hallo,

    Hi

    ich versuche jetzt schon ziemlich lange vergebens einen regulären Ausdruck zu finden, der Links entdeckt. Mein momentaner Stand sieht so aus :

    if ($changetext =~ /(http://[A-Za-z0-9._-%&?/]+?)/ig)   {

    ^

    Mit diesem Fragezeichen nach dem + sagst Du, daß er nicht gierig sein soll.
    Also findet er nur das nötigste.
    Laß es mal weg, und Du wirst etwas mehr Erfolg haben.
    Aber Du wirst damit nicht alle URLs finden, da z.B. = + ; erlaubte Zeichen einer URL sind, diese aber in Deiner [] nicht vorkommen...

    my $tag = "<span class="farbmarkierung">$1</span>";
      $changetext =~ s/$1/$tag/;
      }

    Andreas

    1. Hallo,

      if ($changetext =~ /(http://[A-Za-z0-9._-%&?/]+?)/ig)   {

      Mit diesem Fragezeichen nach dem + sagst Du, daß er nicht gierig sein soll.
      Also findet er nur das nötigste.
      Laß es mal weg, und Du wirst etwas mehr Erfolg haben.

      Ja, ich dachte, sonst würde er vielleicht über alles drüberfahren, was sich ihm in den Weg stellt, aber so klappt es mal, wie du sagst, nur das Problem ist er findet nur den 1. Link obwohl ich zur Probe 3 Links in den Text geschreiben habe.
      Ich habe aber if ../..../g <- verwendet, aber trotzdem findet er nur den 1. Link.
      Wenn ich while verwende, kommt eine Endlosschleife raus, und ich kann nur mit dem Task Manager Perl beenden. ?

      $xNeTworKx.

  3. Hi

    ich versuche jetzt schon ziemlich lange vergebens einen regulären Ausdruck zu finden, der Links entdeckt. Mein momentaner Stand sieht so aus :

    if ($changetext =~ /(http://[A-Za-z0-9._-%&?/]+?)/ig)   {
      my $tag = "<span class="farbmarkierung">$1</span>";
      $changetext =~ s/$1/$tag/;
      }

    $changetext =~ s/(http://[A-Za-z0-9._-%&?/]+)/<span class="farbmarkierung">$1</span>/ig

    Beim Testen, ob der String matcht, macht g überhaupt keinen Sinn.
    Entweder er matcht oder er matcht nicht.
    Du willst aber eigentlich ersetzen, machst das aber fürchterlich umständlich (und nichtfunktionierend). Wenn Du ersetzen willst, dann ersetze, aber matche nicht vorher irgendwas, was Du beim Ersetzen verwenden willst.

    Und wie gesagt, einige erlaubte Zeichen fehlen noch ( = + ; ) und evtl. noch mehr...

    Andreas

    1. Hi,

      $changetext =~ s/(http://[A-Za-z0-9._-%&?/]+)/<span class="farbmarkierung">$1</span>/ig

      ok danke für den Hinweis, ich glaube so wird es funktionieren :)

      $xNeTworKx.

  4. Hallo,
    ich versuche jetzt schon ziemlich lange vergebens einen regulären Ausdruck zu finden, der Links entdeckt. Mein momentaner Stand sieht so aus :

    if ($changetext =~ /(http://[A-Za-z0-9._-%&?/]+?)/ig)   {
      my $tag = "<span class="farbmarkierung">$1</span>";
      $changetext =~ s/$1/$tag/;
      }

    Ich würde statt deinem Teil folgendes schreiben:

    if ($changetext =~ /(http|https)(://)([0-9a-z][0-9a-z-]+.)+([a-z]{2,4})([0-9a-z-/?%=+&._]*?)/){
         $changetext =~ s/(http|https)(://)([0-9a-z][0-9a-z-]+.)+([a-z]{2,4})([0-9a-z-/?%=+&._]*?)/<span class="farbmarkierung">$1$2$3$4$5</span>/gim;
    }

    dein ansatz ersetzt nur den ersten Link in $changetext

    Er findet nur http://w  .
    Und 2. würde ich noch gerne wissen, wie ich diese Schleife am Besten schreiben kann, dass ich nicht $1 verwenden muss, weil wenn ich zB $changetext statt $1 in der 2. Zeile einsetzt und die Klammern weglasse, kopiert er nachher irgendwie den Text ab der gefundenen Stelle und fügt ihn am Schluss wieder dran.
    wenn ich überhaupt die $tag Zeile weglasse und direkt $1 mit <span...>$1</span> ersetze, schneidet er mir einfach des Gefundene weg.
    Ich frage deswegen weil den ganzen Ausdruck einklammern ist ja wohl ziemlich uneffizient, aber wie gesagt, wenn ich $changetext direkt verwende, bekomme ich den Text plötzlich 2 Mal.
    Was kann ich tun ?

    $xNeTworKx.

    1. Hallo,

      class="farbmarkierung">$1$2$3$4$5</span>/gim;

      |
      Wozu dient das m---------------------------------+  ?

      $xNeTworKx.

      1. Hi,

        class="farbmarkierung">$1$2$3$4$5</span>/gim;
                                                         |
        Wozu dient das m---------------------------------+  ?

        Multiline (^ und $ matchen Zeilenanfang/-ende anstelle von Stringanfang/-ende) Braucht man hier eigentlich nicht (kommt kein ^ und kein $ vor)

        Grüße,

        Christian

  5. Hi,
    habe jetzt, dank MudGuard, den Ausdruck so verbessern können, dass er fast richtig funktioniert. Es stört mich aber etwas.
    Wenn ein Link entdeckt wird, der nur mit www statt http:// anfängt, schreibt er mir, nachdem der LInk nach dem abschicken farbig markiert wird, ein ; vor das www also so ; www.
    Warum ist das so ?

    Hier der Ausdruck :
    $changetext =~ s/(^[link][A-Za-z0-9._-%&?/+=;]+[^[/link]])/<span class="farbmarkierung">$1</span>/ig

    $xNeTworKx.

    1. habe jetzt, dank MudGuard, den Ausdruck so verbessern können, dass er fast richtig funktioniert. Es stört mich aber etwas.
      Wenn ein Link entdeckt wird, der nur mit www statt http:// anfängt, schreibt er mir, nachdem der LInk nach dem abschicken farbig markiert wird, ein ; vor das www also so ; www.
      Warum ist das so ?

      Hier der Ausdruck :
      $changetext =~ s/(^[link][A-Za-z0-9._-%&?/+=;]+[^[/link]])/<span class="farbmarkierung">$1</span>/ig

      Hab noch was vergessen. Nach dem LInk werden alle Leerzeichen auch farbig markiert. Jetzt versteh ich gar nichts mehr ?

      $xNeTworKx.