Tom: Regular Expression, meine Lösung

Beitrag lesen

Hello,

der nächste Schritt ist auch geschafft!

(Ich bitte um Berichtigungen)

Code
----

  
$pattern = '=\bhttp://www\.([a-z0-9\-]{2,})\.tld/aktiv\.php\?domain\=\1&code\=\1\b=i';  
  
$ergebnis = preg_match_all($pattern, $string, $_matches, PREG_PATTERN_ORDER || PREG_OFFSET_CAPTURE);  
  
echo "string:  ".htmlspecialchars(print_r($string,1))."<br>";  
echo "pattern: ".htmlspecialchars(print_r($pattern,1))."<br>";  
echo "Ergebnis:".htmlspecialchars(print_r($ergebnis,1))."<br>";  
echo "Treffer: ".htmlspecialchars(print_r($_matches,1))."<br>";  

Ausgabe
-------
string:  In diesem Text steht eine URL: http://www.VARIABEL.tld/aktiv.php?domain=VARIABEL&code=VARIABEL
           in der kein Umruch sein darf und hier ist der zweite Hinweis
           http://http://www.VARIABEL1.tld/aktiv.php?domain=VARIABEL&code=VARIABEL, der
           aber nicht gefunden werden darf. Erst der dritte ist wieder im Muster,
           dass wir vorgegebenn haben:http://www.VARI.tld/aktiv.php?domain=VARI&code=VARI; Ende der Durchsage
pattern: =\bhttp://www.([a-z0-9-]{2,}).tld/aktiv.php?domain=\1&code=\1\b=i
Ergebnis:2
Treffer: Array
(
    [0] => Array
        (
            [0] => http://www.VARIABEL.tld/aktiv.php?domain=VARIABEL&code=VARIABEL
            [1] => http://www.VARI.tld/aktiv.php?domain=VARI&code=VARI
        )

[1] => Array
        (
            [0] => VARIABEL
            [1] => VARI
        )

)

Das Pattern:
------------

=\bhttp://www.([a-z0-9-]{2,}).tld/aktiv.php?domain=\1&code=\1\b=i

=                      Patterngrenze Anfang
\b                     beginnt mit einer Wortgrenze
http://www             Zeichen müsse vorkommen
.                     Punkt muss drin sein, escaped, da Steuerzeichen in Patterns
([a-z0-9-]{2,})       Backreferenz, weil dreimal gleich im Muster vorkommen muss
   [a-z0-9-]          Alle Zeichen von a-z, von 0-9, und der Bindestrich
                       weil dies _bisher_ die einzigen  waren, die in Domainnamen
                       vorkommen durften (Großbuschtaben siehe Modifier)
                       fehlen jetzt aber noch die Umlaute und sonstigen neuerdings
                       auch erlaubten Zeichen, wie Pannen-Kot (PUNI-Code) usw.
   {2,}                was in der Klammer davor steht, mindestens 2 Mal
.                     Punkt als Zeichen im Muster
tld/aktiv              Text, der drinstehen soll
.                     Punkt als Zeichen im Muster
php                    Text, der drinstehen soll
?                     Fragezeichen als Zeichen im Muster, muss escaped werden, weil ...
domain                 Text, der drinstehen soll
=                     Gleichheitszeichen als Zeichen im Muster, muss escaped werden,
                         weil es auch als Beginn- und Endezeichen für das Pattern benutzt
                         wurde
\1                     Backreferenz, d.h., dass es gelich dem ersten Ausdruck in
                         runden Klammern sein muss
&code                  Text, der drinstehen soll
=                     Gleichheitszeichen als Zeichen im Muster, muss escaped werden ...
\1                     Backreferenz, wie vorige
\b                     Wortgrenze
=                      Ende des Patterns
i                      Modifier für das Pattern, es soll case insensitive gesucht werden

Das ganze Ding müsste nun noch Pannen-Kot-fest gemacht werden und dann vielleicht auf utf-8 vorbereitet werden...

Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau
Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)