Problem mit Regulärem Ausdruck
Maike
- php
0 Henryk Plötz0 Maike0 Henryk Plötz0 Maike0 Henryk Plötz0 Maike
0 Maike
Hallo,
habe mir folgenden reg. Ausdruck gebastelt
$zeile = "... index.php?isbn=3-453-87737-3&sid=hOeea1067381011 ...";
$pattern = '/^isbn=(.{2,})&$/';
while (preg_match($pattern, $zeile, $txt))
{
/* $txt[3] enthält den gewünschten Text. */
echo $txt[2]."\n";
/* $zeile neu bauen */
$zeile = $txt[1].$txt[6];
}
In $zeile wird eine Datei eingelesen, in der Links in der Form index.php?isbn=3-453-87737-3&sid=hOeea1067381011 vorkommen. Ich möchte nun, dass aus diesen Links alles zwischen "isbn=" und "&" rausgesucht wird. Irgendwie klappt das nicht.
Wer kann mir helfen?
Daaaaaanke, Eure Maike
Moin,
$pattern = '/^isbn=(.{2,})&$/';
In $zeile wird eine Datei eingelesen, in der Links in der Form index.php?isbn=3-453-87737-3&sid=hOeea1067381011 vorkommen. Ich möchte nun, dass aus diesen Links alles zwischen "isbn=" und "&" rausgesucht wird. Irgendwie klappt das nicht.
Du hast das Suchmuster am Anfang und am Ende mit Ankern ausgestattet, was dafür sorgt dass es nur auf Strings zutrifft die mit isbn= beginnen und mit & aufhören. Mache also erstmal das ^ und $ weg.
Wenn du das ausserdem auf eine ganze Datei ansetzt wird das so auch nicht gehen: Reguläre Ausdrücke sind per default 'gierig', d.h. sie matchen so viel sie können. Da du den . verwendet hast ist das so eine Art Freifahrtschein: Es wird alles vom ersten isbn= bis zum letzten & in der jeweiligen Zeile gematcht. Du kannst jetzt entweder den Ausdruck auf nongreedy umstellen, oder den Punkt durch [^&] ersetzen, was auf alles ausser dem & matcht. (Du solltest dir dann aber sicher sein dass die ISBN wirklich immer von einem & abgeschlossen wird.)
Ausserdem dürfte die Schleife so wie du sie hast nicht funktionieren, ich bin mir aber auch nicht sicher was sie machen soll. Wenn du einfach alle ISBNs finden willst, ist http://www.php.net/preg_match_all vielleicht dein Freund.
Hallo Henry,
hab mal Deinen Tipp befolgt ... leider klappt das nicht so ganz. Evtl kannst Du Dir das mal anschauen:
$in__url="http://www.buchtipp.de/auswahl.php3?bereich=Top+Tips";
$in__alt_pre = file("$in__url");
for($in__x=0;$in__x<count($in__alt_pre);$in__x++)
{
$zeile .= trim($in__alt_pre[$in__x]);
}
echo $zeile;
preg_match_all ("/\d{1,}-\d{1,}-\d{1,}-\d{1,}/x",$zeile, $matches);
for ($i=0; $i< count($matches[0]); $i++) {
echo $matches[0][$i]."<br>";
}
Vielen Dank,
Maike
Moin,
hab mal Deinen Tipp befolgt ... leider klappt das nicht so ganz. Evtl kannst Du Dir das mal anschauen:
Dein Skript funktioniert ganz gut, aber
$in__url="http://www.buchtipp.de/auswahl.php3?bereich=Top+Tips";
ist nur die URL des Framesets, da sind natürlich keine ISBNs drin. Der URL des Frames mit dem Inhalt ist in diesem Fall http://216.92.25.14/auswahl.php3?bereich=Top+Tips
Was mir grade noch aufgefallen ist: Scheinbar braucht eine ISBN nicht nur aus Zahlen zu bestehen. Einer der Links ("Körperintelligenz") verweist auf ...?isbn=3-423-24366-X&sid=Iekjw1067434228&bereich=Top+Tips
Hallo Henry,
Was mir grade noch aufgefallen ist: Scheinbar braucht eine ISBN nicht nur aus Zahlen zu bestehen. Einer der Links ("Körperintelligenz") verweist auf ...?isbn=3-423-24366-X&sid=Iekjw1067434228&bereich=Top+Tips
Oh ja, das fällt mir jetzt gerade auch auf - kann ich das in meinem reg. Ausdruck irgendwie berücksichtigen, das evtl. am Ende ein Buchstabe steht?
Gut wäre auch noch, wenn der reg. Ausdruck berücksichtigt, dass vor der Zahl ein "isbn=" stehen muss, damit nicht zufällig auch z.B. anderen Nummern mit gematched werden.
Leider kriege ich das nicht hin :-(( ich verstehe nicht wie das gehen soll ...
Tausend Dank an Dich. Du bist echt sehr nett ...
LG, Maike
Moin,
Oh ja, das fällt mir jetzt gerade auch auf - kann ich das in meinem reg. Ausdruck irgendwie berücksichtigen, das evtl. am Ende ein Buchstabe steht?
Na, indem du da nicht nur \d erlaubst, sondern auch Buchstaben, also zum Beispiel [a-zA-Z0-9] oder gar [^&]
Gut wäre auch noch, wenn der reg. Ausdruck berücksichtigt, dass vor der Zahl ein "isbn=" stehen muss, damit nicht zufällig auch z.B. anderen Nummern mit gematched werden.
Du kannst so wie gehabt ein isbn= davor schreiben und das was du willst einklammern. Dann findest du deine Zahlen als Array in $matches[1] statt $matches[0].
Oder du benutzt Assertions, mehr dazu in der Doku.
Hi,
nochmal vielen Dank - alle klappt prima ...
LG
Ach noch was ...
Wie kann ich denn verhindern, dass doppelte Einträge erscheinen?
Gruss, Maike
Moin,
Wie kann ich denn verhindern, dass doppelte Einträge erscheinen?
Mit array_unique (http://www.php.net/array_unique).