Suchmuster (URL) aus Text extrahieren
Björn
- php
Hallo liebe Forumgemeinde,
ich habe seit längerem ein Problem was ich trotz der relativ klaren Aufgabenstellung einfach nicht gelöst bekomme. Selbstverständlich habe ich diese und viele andere Foren bereits nach Lösungen durchkämmt, komme aber eben nicht wirklich weiter.
Mein Problem ist folgendes:
Ich habe einen Ausgangstext in dem unter anderem einige URLs enthalten sind. Von diesen müssen aber nur einige URLs mit einem bestimmten Format (siehe unten) ausgelesen werden. Nun habe ich bereits sämtliche Suchmuster die ich finden konnte mit preg_match(); durchprobiert, aber es will einfach nicht klappen. Ich wäre ewig dankbar wenn mal jemand mit Ahnung ein Suchmuster für mich stricken könnte damit ich folgende URLs aus dem Text auslesen kann:
http://www.VARIABEL.tld/aktiv.php?domain=VARIABEL&code=VARIABEL
Wie kann das gelöst werden? Vielen Dank für euere Mithilfe!
Björn
Hello Björn,
[...] ein Suchmuster für mich stricken könnte damit ich folgende URLs aus dem Text auslesen kann:
http://www.VARIABEL.tld/aktiv.php?domain=VARIABEL&code=VARIABEL
Wie kann das gelöst werden? Vielen Dank für euere Mithilfe!
Wieso Mithilfe?
Du hast bisher nicht gepostet, was Du schon versucht hast.
Aber ich habe trotzdem ein wenig geübt.
#$pattern = '=\bhttp://www.([a-z0-9-]{2,}).tld/aktiv.php?([a-z0-9-]{2,})domain=([a-z0-9-]{2,})&code=([a-z0-9-]{2,})\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>";
Nur mit dem Teil, dass VARIABEL überall gleich sein muss, komme ich noch nicht klar.
Wie man da eine Bckreferenz nutzen kann, die sich auf das erste Vorkommen von VARIABEL bezieht, habe ich noch nicht rausgefunden.
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Hello,
das richtige Pattern hatte ich eben natürlich gelöscht :-(
#$pattern = '=\bhttp://www.([a-z0-9-]{2,}).tld/aktiv.php?([a-z0-9-]{2,})domain=([a-z0-9-]{2,})&code=([a-z0-9-]{2,})\b=i';
$pattern = '=\bhttp://www.([a-z0-9-]{2,}).tld/aktiv.php?domain=$1&code=([a-z0-9-]{2,})\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>";Nur mit dem Teil, dass VARIABEL überall gleich sein muss, komme ich noch nicht klar.
Wie man da eine Bckreferenz nutzen kann, die sich auf das erste Vorkommen von VARIABEL bezieht, habe ich noch nicht rausgefunden.
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Hello,
das richtige Pattern hatte ich eben natürlich gelöscht :-(
Und nochmal das falsche.
Aber Du siehst, ich habe wenigstsns 'was ausprobiert!
#$pattern = '=\bhttp://www.([a-z0-9-]{2,}).tld/aktiv.php?([a-z0-9-]{2,})domain=([a-z0-9-]{2,})&code=([a-z0-9-]{2,})\b=i';
#> $pattern = '=\bhttp://www.([a-z0-9-]{2,}).tld/aktiv.php?domain=$1&code=([a-z0-9-]{2,})\b=i';
$pattern = '=\bhttp://www.([a-z0-9-]{2,}).tld/aktiv.php?domain=([a-z0-9-]{2,})&code=([a-z0-9-]{2,})\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>";
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
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
gudn tach!
auch wenn das problem ja mittlerweile geloest wurde und dieser teilthread sich mit einem problem beschaeftigt, das eigentlich keiner in diesem thread hat, moechte ich wegen
(Ich bitte um Berichtigungen)
noch zwei kleine umformulierungen vorschlagen.
$pattern = '=\bhttp://www\.([a-z0-9\-]{2,})\.tld/aktiv\.php\?domain\=\1&code\=\1\b=i';
die delimiter sind vor allem deshalb variabel, damit man das maskieren moeglichst stark reduzieren kann. das gleichheitszeichen ist deshalb hier eher ungeschickt. besser waere bspw. die tilde.
in character classes muss das minus-zeichen nicht maskiert werden, wenn es am anfang oder ende steht.
somit koennte man drei zeichen sparen:
~\bhttp://www.([a-z0-9-]{2,}).tld/aktiv.php?domain=\1&code=\1\b~i
prost
seth
Hello seth,
(Ich bitte um Berichtigungen)
noch zwei kleine umformulierungen vorschlagen.
für die ich mich bedanke.
Die eine (Delimiter) habe ich mir schon gedacht, aber nicht weiter verfolgt...
$pattern = '=\bhttp://www\.([a-z0-9\-]{2,})\.tld/aktiv\.php\?domain\=\1&code\=\1\b=i';
die delimiter sind vor allem deshalb variabel, damit man das maskieren moeglichst stark reduzieren kann. das gleichheitszeichen ist deshalb hier eher ungeschickt. besser waere bspw. die tilde.
in character classes muss das minus-zeichen nicht maskiert werden, wenn es am anfang oder ende steht.somit koennte man drei zeichen sparen:
~\bhttp://www.([a-z0-9-]{2,}).tld/aktiv.php?domain=\1&code=\1\b~i
... und damit wahrscheinlich auch ein bisschen Power einsparen in der Reg-Exp-Maschine?
Das wäre mir dann durchaus wichtig, gerade wenn man preg_match_all() oder ähnliche Schliefenkonstrukte benutzt.
prost
Das nehme ich jetzt wörtlich ;-)
Gibt nur noch samstags das geliebte Hefeweizen. Ich muss abnehmen...
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
gudn tach!
somit koennte man drei zeichen sparen:
~\bhttp://www.([a-z0-9-]{2,}).tld/aktiv.php?domain=\1&code=\1\b~i... und damit wahrscheinlich auch ein bisschen Power einsparen in der Reg-Exp-Maschine?
ich weiss es nicht, aber vermute sehr stark, dass bei der geschwindigkeit hier kein merklicher unterschied auftreten sollte.
Gibt nur noch samstags das geliebte Hefeweizen. Ich muss abnehmen...
wobei bier gar nicht so sehr fuer dicke baeuche verantworlich ist, wie haeufig angenommen.
http://images.zeit.de/text/2000/46/200046_stimmts.xml
prost
seth
Hallo Tom,
erst mal 1000 Dank für deine Mühe, dann evtl. zum Ausdruck VARIABEL noch eine Ausführung zum besseren Verständnis. Hiermit habe ich die Teile der URL bezeichnet die nicht immer gleich sind sondern in jeder neuen URL auch anders vergeben sind. Oder einfacher ausgedrückt an diesen URLs sind alle Zeichen Variabel mit Ausnahme von:
/aktiv.php?domain=
und
&code=
die in allen gefundenen URLs immer gleich sind. Auf eine Auflistung dessen was ich schon probiert habe wurde wohlweislich verzichtet ;-)
Mein letzter Stand der eben auch nicht funktionierte war folgender:
(nur der Suchstring)
preg_match_all('/<a(.*?)href=['"]((http)s?://[^/ ]*(/[a-z0-9/-._%;,?&+[]=]*)?)'">(.*?)/im', $eingabe, $ausgabe, PREG_SET_ORDER);
wobei die oben genannten feststehenden Begriffe mangels meiner Kenntnisse nicht berücksichtigt sind.
Ich werde deine Version jetzt mal aufspielen und sehen was mir die Kiste liefert, das Ergebnis poste ich dann umgehend.
Viele Grüsse
Björn
Hello,
[...] zum Ausdruck VARIABEL noch eine Ausführung zum besseren Verständnis.
Hiermit habe ich die Teile der URL bezeichnet die nicht immer gleich sind sondern in jeder
neuen URL auch anders vergeben sind.
Du hast aber nicht dazu gechreieben, ob das erste Vorkommen von "VARIABEL" einen anderen Wert repräsentieren soll, als das zweite und das dritte.
Wenn die nämlich alle unterschiedlich sein dürfen, muss für die beiden im Instructor-Teil noch das Pattern geänsert werden. Da _dürfen_ dann alle Zeichen vorkommen, die z.B. urlencode() als Ergebnis liefern könnte, also auch Großbuchstaben, &, Semikolon, Unterstrich, usw.
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Hallo Tom,
Du hast aber nicht dazu gechreieben, ob das erste Vorkommen von "VARIABEL" einen anderen Wert repräsentieren soll, als das zweite und das dritte.
Ja da gebe ich dir recht dies ist nicht eindeutig beschrieben. Diese VARIABEL Bezeichnungen sind völlig unterschiedliche Werte die von einem externen Script mit der URL übergeben werden.
3 Beispiele für solche Rückgaben die in meinem Text vorkommen:
http://www.allgemeines.info/aktiv.php?domain=tolledomain.de.vu&code=7114d
http://besonderes.com/aktiv.php?domain=bloededomain.at&code=6654a
http://www.spezielles.de/aktiv.php?domain=meinedomain.com&code=de44s
Jetzt verständlicher?
Danke und Grüsse
Björn
Hello,
Du hast aber nicht dazu gechreieben, ob das erste Vorkommen von "VARIABEL" einen anderen Wert repräsentieren soll, als das zweite und das dritte.
Ja da gebe ich dir recht dies ist nicht eindeutig beschrieben. Diese VARIABEL Bezeichnungen sind völlig unterschiedliche Werte die von einem externen Script mit der URL übergeben werden.
3 Beispiele für solche Rückgaben die in meinem Text vorkommen:
http://www.allgemeines.info/aktiv.php?domain=tolledomain.de.vu&code=7114d
http://besonderes.com/aktiv.php?domain=bloededomain.at&code=6654a
http://www.spezielles.de/aktiv.php?domain=meinedomain.com&code=de44s
Jetzt verständlicher?
Ich hatte Dich schon verstanden und diese Möglichkeit in Betracht gezogen, sonst hätte ich die substantieerende Frage nicht stellen können...
Das bedeutet Für das Pattern aber, dass Du die Backrefernzen wieder rausnehmen und gegen einen Ausdruck austauschen musst, der die erlaubten Zeichen für diese Stellen darstellt.
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
Halo Tom,
jetzt funktioniert alles, vielen Dank für deine Mühe!!!!
Viele Grüsse
Björn
Hello,
jetzt funktioniert alles, vielen Dank für deine Mühe!!!!
Könntest Du uns für's Archiv dann bitte noch deinen teil des Patterns für den Parameter-Teil des URi posten?
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom