Tom: Regular Expressions, Bedeutung des Punktes

Hello,

in http://www.rrz.uni-hamburg.de/RRZ/W.Wiedl/Skripte/CGI-Perl/Regulaere_Ausdruecke/REIntro.htm#1.1 und anderen Quellen habe ich gelesen, das der Punkt als Metazeichen für alle Zeichen, außer "\n" steht.

Ich habe mir zur Lösung einer Aufgabe eine Funktion aus dem Archiv gepult von Horst Nogajski.
http://forum.de.selfhtml.org/archiv/2004/10/t92580/#m558300
um alle Hyperreferenzen in einer Seite zu finden.

Hab sie erstmal umgebaut, um diese RegExps endlich mal zu verstehen...

function get_urls($page)
{
 $_urls = array();
 $_a = array();
 $newpage = '';
 //              1          2        3          4            <5>           6           7
 $pattern = '=^(.*?)(<area|<a|<img)(.*?)(href=|src=)"|'"|'(>.*$|>.*?</a>.*$)=msi';
 while(preg_match($pattern, $page, $_a))
 {
  if(count($_a)>1)
  {
   $page = $_a[7];
   #$newpage .= $_a[1].$_a[2].$_a[3].$_a[4].'"'.rewrite_url($_a[5]).'"'.$_a[6];
   $_urls[] = $_a[5];
  }
 }
 # return $newpage.$page;
 return $_urls;
}

Nun steht in der Seite, die ich testhalber durchsuchen lasse, aber

<center><p><a href="http://www.bitworks.de/?link=harte-harzer"
          target="bitworks"><img border="0"
          src="gfx/bitworks_head_small.gif"
          alt="bitworks Logo"
          title="frag doch bitworks..."
          width="100" height="40"></a></p></center>

drin.

Es befinden sich nach dem "<img" also auch ein Umbruch, bevor das "src=" folgt.

Wieso findet die Funktion die Bildreferenz trotzdem?

Das gefällt mir zwar, weil es so arbeitet, wie ich es benötige, aber es würe mir noch besser gefallen, wenn ich es auch verstehen könnte.

Harzliche Grüße aus http://www.annerschbarrich.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau
  1. Hi,

    Hab sie erstmal umgebaut, um diese RegExps endlich mal zu verstehen...
    $pattern = '=[...]=msi';
    Wieso findet die Funktion die Bildreferenz trotzdem?

    ich habe mal einfach den Teil stehen gelassen, der das Geheimnis enthält :-)

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hello,

      Hab sie erstmal umgebaut, um diese RegExps endlich mal zu verstehen...
      $pattern = '=[...]=msi';
      Wieso findet die Funktion die Bildreferenz trotzdem?

      ich habe mal einfach den Teil stehen gelassen, der das Geheimnis enthält :-)

      In diesem Falle hätte es mich wohl angesprungen ;-))

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
  2. hi,

    [...] und anderen Quellen habe ich gelesen, das der Punkt als Metazeichen für alle Zeichen, außer "\n" steht.

    generell ja.

    $pattern = '=^(.*?)(<area|<a|<img)(.*?)(href=|src=)"|'"|'(>.*$|>.*?</a>.*$)=msi';

    hier werden am ende also die modifier m, s und i verwendet.

    Es befinden sich nach dem "<img" also auch ein Umbruch, bevor das "src=" folgt.

    Wieso findet die Funktion die Bildreferenz trotzdem?

    http://www.php.net/manual/de/reference.pcre.pattern.modifiers.php
    zum modifier s:
    "s (PCRE_DOTALL)
    Wenn dieser Modifikator gesetzt ist, passt das Metazeichen Punkt im Suchmuster auf alle Zeichen inklusive Zeilenumbrüche. Ohne diesen Modifikator sind Zeilenumbrüche ausgeschlossen. [...]"

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo wahsaga.

      http://www.php.net/manual/de/reference.pcre.pattern.modifiers.php
      zum modifier s:
      [...]

      Verräter! ;-)

      Einen schönen Montag noch.

      Gruß, Ashura

      --
      Selfcode: sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:) fl:( ss:) ls:[ js:|
      30 Days to becoming an Opera8 Lover -- Day 21: Toolbars
      Meine Browser: Opera 8.01 | Firefox 1.0.6 | Lynx 2.8.5 | Netscape 4.7 | IE 6.0
      [Deshalb frei! - Argumente pro freie Software]
    2. Hello,

      Wenn dieser Modifikator gesetzt ist, passt das Metazeichen Punkt im Suchmuster auf alle Zeichen inklusive Zeilenumbrüche. Ohne diesen Modifikator sind Zeilenumbrüche ausgeschlossen. [...]"

      *schluck*
      hätte ich auch selbst drauf kommen können.
      Die Seite hatte ich extra noch ausgeduckt für meine Unterlagen...

      Auf jeden Fall danke für die schnelle Aufklärung.

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
  3. Hello,

    noch eine Frage zum Thema:

    kann man irgendwie steuern, dass z.B. nach einen Doppelhäkchen auch als Abschluss der Sequenz gesucht wird, wenn diese auch mit einem Doppelhäkchen begonnen hat?

    Also immer das passende Abschlusszeichen suchen zum einleiteten Zeichen.
    Betrifft auch genauso die Klammern.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hi,

      kann man irgendwie steuern, dass z.B. nach einen Doppelhäkchen auch als Abschluss der Sequenz gesucht wird, wenn diese auch mit einem Doppelhäkchen begonnen hat?

      ja. Allerdings müssen diese Doppelhäkchen innerhalb des Strings stehen, der durch Doppel- oder Einzelhäkchen begrenzt wurde. Oder habe ich Dich falsch verstanden?

      Cheatah

      --
      X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
      X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
      X-Will-Answer-Email: No
      X-Please-Search-Archive-First: Absolutely Yes
      1. Hello,

        kann man irgendwie steuern, dass z.B. nach einen Doppelhäkchen auch als Abschluss der Sequenz gesucht wird, wenn diese auch mit einem Doppelhäkchen begonnen hat?

        ja. Allerdings müssen diese Doppelhäkchen innerhalb des Strings stehen, der durch Doppel- oder Einzelhäkchen begrenzt wurde. Oder habe ich Dich falsch verstanden?

        Weiß ich nicht... ;-)

        <a href ='http://www.domain.tld' title="Hier geht's zu Karls Seite">Karl's Seite</a>

        So oder so ähnlich stellt sich das Problem dar. Ist jetzt etwas an den haaren herbeigezogen, wäre aber so denkbar. Die Browser sind in dieser Situation auch recht intelligent, und lassen sich (meistens) nicht durcheinanderbringen.

        Das würde ich der RegExp auch gerne beibringen.

        Ich weiß also nicht, ob der String mit " oder ' eingeleitet und beendet wird.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
    2. hi,

      kann man irgendwie steuern, dass z.B. nach einen Doppelhäkchen auch als Abschluss der Sequenz gesucht wird, wenn diese auch mit einem Doppelhäkchen begonnen hat?

      du kannst mit {nummer} auf bereits vorher erzeugte back references zugreifen. (was dabei zu beachten ist, damit das nicht als oktalziffer verstanden wird, steht im abschnitt http://www.php.net/manual/de/reference.pcre.pattern.syntax.php#regexp.reference.backslash)

      beispiel:

        
      <?php  
      $test = array('dies ist ein "test", baby',  
                    'dies ist ein "test\', baby',  
                    'dies ist ein \'test\', baby',  
                    'dies ist ein \'test", baby');  
      print_r($test);  
        
      foreach($test as $teststring) {  
           preg_match('/(["|\'])([a-z]+)(\1)/', $teststring, $treffer);  
           print_r($treffer);  
      }  
      ?>  
      
      

      in diesem suchmuster
      '/(["|'])([a-z]+)(\1)/'
      liefert (["|']) die erste back reference, wenn es ein " oder ' findet.
      danach möchten wir ein paar buchstaben haben,
      und anschließend wieder das, was in der ersten back reference drin steht (\1).

      das beispielscript findet beim ersten und dritten beispieltext aus dem array einen treffer, bei den anderen beiden nicht.

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
      1. Hello,

        danke, so habe ich das gemeint.
        Nun muss ich wohl mal fleißig damit herumspielen, damit ich es irgendwann auch mal auswendig kann ...

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau