Brauche RegExp-Hilfe

Hallo liebe Experten,

Nachdem diese Regexp für mich ja nach wie vor ein Buch mit mehr als nur sieben Siegeln sind bräuchte ich einen Tipp von euch.

Und zwar brauche ich eine Funktion, die mir die Links aus einem eingelesenem html-File raussucht.
Das Problem, weswegen ich im Internet bisher nichts passendes gefunden hat ist zum einen, dass es ein relativer Link ist, den ich zu ermitteln versuche (natürlich dynamisch generiert mit Übergabeparametern).
Zum anderen ist es kein einfaches Linkname ist, sondern dass im Tag auch noch andere Dinge wie Klassen, Titel oder Targets drin stehen…
Mich interessiert als Rückgabewert aber nur der Link und entweder die Angabe im title="" oder bevorzugt das, was der Normale User zu lesen bekommt - also das zwischen und.

Wenn mir jemand dabei helfen könnte wäre das ganz super!

Falls es hilft: Der Link steht immer in Anführungszeichen (") und nicht in Hochkommas (’).

Grüße und Danke
Munich

z.b. so
da wo du (.*) siehst, landet es in $matches

<?php $testurls ="<a title=\"russland\" name=\"willy\" href=\"/megaupload.php?russland\">Halllo Megarussland";
preg\_match\_all("/(.\*)/",$testurls,$matches,PREG\_SET\_ORDER);
print\_r($matches);
?\>

title ist schon schwierieger, da man nicht weiss welche reihenfolge (vor dem href, nach dem href :smile:

Hallo liebe Experten,

Nachdem diese Regexp für mich ja nach wie vor ein Buch mit
mehr als nur sieben Siegeln sind bräuchte ich einen Tipp von
euch.

Und zwar brauche ich eine Funktion, die mir die Links aus
einem eingelesenem html-File raussucht.

„Do not use REGEX to parse HTML“
http://www.phpro.org/examples/Get-Links-With-DOM.html

„Do not use REGEX to parse HTML“
http://www.phpro.org/examples/Get-Links-With-DOM.html

hmmm schön und gut, aber dieses DOM muss ich dann auch irgendwie einbinden, oder?
Jedenfalls bekomme ich mit dem Codebeispiel so wie es auf der Seite steht nur ein
Parse error: parse error, unexpected T_OBJECT_OPERATOR in c:…\www\regtest2.php on line 43

was der Zeile
$ret[$tag->getAttribute(‚href‘)] = $tag->childNodes->item(0)->nodeValue;
entspricht…

Auf meinem online Webspace hab ichs noch nicht versucht…

Ansonsten sieht das aber schon mal ganz nett aus :wink:

Grüße
Munich

<?php :blush:testurls ="href=\"/megaupload.php?russland\"\>Halllo Megarussland"; preg\_match\_all("/(.\*)/",$testurls,$matches,PREG\_SET\_ORDER); print\_r($matches); ?\>

also wenn ich das SET durch ein PATTERN austausche (hab ich in nem anderen Befehl gefunden) dann funktionierts…
Allerdings nicht, wenn ich mehrere Links in $testurls habe…
Allerdings krieg ich das zur Not über ne rekursive Schleife hin…

Ich werd diesem DOM aber auch noch ein paar graue Zellen opfern und gucken, ob sich da was draus entwickeln könnte… :wink:

Danke schon mal
Munich

Hi
Das Beispiel funktioniert und auch nur so sollte es gemacht werden.
Deine Fehler die diese Ausgabe verursachen könnten wären zum einen das du eine PHP Version kleiner 5.0.3 hast. Erst dort wurde das DOM-Object in PHP übernommen. Wenn du eine niedrigere Version hast lies bitte hier de.php.net/DOM.

Weiter könnte es sein das du versucht nur den link zu übergeben. Dann sollte aber eine Exception geworfen können das auf dem übergebenen Text kein DOM angewandt werden kann.

Gruß Lamer

1 Like

hmmm schön und gut, aber dieses DOM muss ich dann auch
irgendwie einbinden, oder?
Jedenfalls bekomme ich mit dem Codebeispiel so wie es auf der
Seite steht nur ein
Parse error: parse error, unexpected T_OBJECT_OPERATOR in
c:…\www\regtest2.php on line 43

also bei mir gehts :smile:

<?php $testurls ="<a title=\"russland\" name=\"willy\" href=\"/megaupload.php?russland\">Halllo Megarusslandkdlsfhksjdfhlksdjfh[wiederschüss](%255C%2522/megaupload.php?sdfsdfsdf%255C%2522)";

 function getsLinks($html)
 {
 /\*\*\* return array \*\*\*/
 $ret = array();

 /\*\*\* a new dom object \*\*\*/
 $dom = new domDocument;

 /\*\*\* get the HTML (suppress errors) \*\*\*/
 @$dom-\>loadHTML($html);

 /\*\*\* remove silly white space \*\*\*/
 $dom-\>preserveWhiteSpace = false;

 /\*\*\* get the links from the HTML \*\*\*/
 $links = $dom-\>getElementsByTagName('a');

 /\*\*\* loop over the links \*\*\*/
 foreach ($links as $tag)
 {
 $ret[$tag-\>getAttribute('href')] = $tag-\>childNodes-\>item(0)-\>nodeValue;
 }

 return $ret;
 }

 /\*\*\* get the links \*\*\*/
 $urls = getsLinks($testurls);

 /\*\*\* check for results \*\*\*/
 if(sizeof($urls) \> 0)
 {
 foreach($urls as $key=\>$value)
 {
 echo $key . ' - '. $value . '
';
 }
 }
 else
 {
 echo "No links found at $link";
 } 
?\>

ich habs abgeändert um HTML via variable (nicht via url) zu durchsuchen .

1 Like

Hi
Das Beispiel funktioniert und auch nur so sollte es gemacht
werden.
Deine Fehler die diese Ausgabe verursachen könnten wären zum
einen das du eine PHP Version kleiner 5.0.3 hast. Erst dort
wurde das DOM-Object in PHP übernommen. Wenn du eine
niedrigere Version hast lies bitte hier de.php.net/DOM.

ok, daran lags…
Lokal hab ich nur php 4.x
Auf meinem Webspace funktioniert das Script auch ohne Probleme!
Vielen Dank und nochmal 2 Sternchen für eure beiden Beiträge :smile:

dann würde ich die lokale version mal auf stand bringen
php4 wird schon seit 1,5 Jahren nicht mehr unterstützt…

und es gibt in php5 einige Funktionen / Klassen die es deutlich schicker und einfacher machen

Gruß