urls aus text auslesen

pangu

Angesehenes Mitglied
nehmen wir an, ich habe folgenden Beispieltext:
QUOTE
dies ist ein beispieltext http://www.xyz.ch mit ganz vielen verschiedenen links, zb: <a href="http://www.de">www.ch</a> sdfgsdfgsdfgsdfg dfgdfg dfgdfg



wie kann ich jetzt daraus die urls auslesen, dass ich folgenden neuen text erhalte:

QUOTE
<a href="http://www.xyz.ch>http://www.xyz.ch</a>
<a href="http://www.de">www.ch</a>



..also anklickbare Links OHNE den Text?
thx

mein bisheriger ansatz:

CODE
$urlsuch[]="/([^]_a-z0-9-=\"'\/])((https?|ftp):\/\/|www\.)([^ \r\n\(\)\^\$!`\"'\|\[\]\{\}<>]*)/si";
$urlsuch[]="/^((https?|ftp):\/\/|www\.)([^ \r\n\(\)\^\$!`\"'\|\[\]\{\}<>]*)/si";

$urlreplace[]="\\1\\2\\4";
$urlreplace[]="\\1\\3";

$text = preg_replace($urlsuch, $urlreplace, $text);

$text = preg_replace("/\[URL\]www.(.*?)\[\/URL\]/si", "<a target=\"_blank\" href=\"http://www.\\1\">www.\\1</a>", $text);

$text = preg_replace("/\[URL\](.*?)\[\/URL\]/si", "<a target=\"_blank\" href=\"\\1\">\\1</a>", $text);



-> wie kann ich jetzt noch den restlichen text entfernen? (das also NUR die anklickbaren urls übrigbleiben?)

geht das mit preg_match_all?
 
Hallo.

CODE preg_match_all('/\<a(.*?)href=[\'"]((http|ftp)s?\:\/\/[^\/ ]*(\/[a-z0-9\/\-\._\%;,\?&\+\[\]\=]*)?)[\'"](.*?)\>(.*?)\<\/a\>/im', $eingabe, $ausgabe, PREG_SET_ORDER);

for( $i = 0; $i < count($ausgabe); $i++ ) {
  echo 'URI: ' . $ausgabe[$i][2] . '<br />';
  echo 'Linktext: ' . $ausgabe[$i][6] . '<br /><br />';
}


Dieser Code sollte alle festen Links innerhalb des href-Attribute von den Link-Tags finden. Gegebenfalls muss noch der Ausdruck innerhalb des "href" Attributes etwas angepasst werden. Ich habe bei den Domainnamen ganz bewusst [^\/]* als Ausdruck verwendet, um auch Domains nach den IDNA [1] Standard zu finden. Punycode [2] zu kontrollieren ist etwas umständlicher, doch kannst Du innerhalb der for-Schleife jeden Link nochmals kontrollieren.
Dieser Ansatz geht jedoch davon aus, dass feste Links verwendet werden mit Servernamen usw. Wenn das Script auch direkt kontrollieren soll, ob die URL auch richtig gequotet wurde, dann muss Du das ganze zweimal durchlaufen lassen und die beiden Stellen mit [\'"] durch \' bzw. " ersetzen.
Vielleicht muss der Ausdruck noch angepasst werden, da ich nicht auf jedes Zeichen innerhalb einer URI geachtet habe, da dies etwas mehr Zeit in Anspruch nimmt.



MfG Sascha Ahlers
 
yep, das scheint zu klappen. vielen dank!
smile.gif
 
Ich habe den Code gerade nochmal etwas bearbeitet, da ich das Gleichheitszeichen in dem Regulären Ausdruck vergessen habe, was doch noch sehr wichtig ist bei einer URI...


MfG Sascha Ahlers
 
QUOTE (pangu @ Fr 16.9.2005, 21:10) [...]
-> woran liegt das?

Da habe ich halt zwei Zeichen vergessen, ich habe das nochmal kurz nachgebesser, auch im oberen Code.
Hier nochmal rot hervorgehoben, welche Zeichen ich hinzugefügt habe (das sind halt Flüchtigkeitsfehler, darum soll man ja auch Software vorher gründlich testen).


QUOTE preg_match_all('/\<a(.*?)href=[\'"]((http|ftp)s?\:\/\/[^\/]*(\/[a-z0-9\/\-\._\%;,\?&\+\[\]\=]*)?)[\'"](.*?)\>(.*?)\<\/a\>/im', $eingabe, $ausgabe, PREG_SET_ORDER);



MfG Sascha Ahlers
 
thx, will das auch besser lernen: kennst du eine seite wo man reguläre expressions gut lernen kann?
 
Hallo,

ich habe auch noch einen Fehler?! entdeckt.
Folgender Link wird nicht richtig erkannt bei deinem regulären Ausdruck

<a href="http://www.link.de" title="textirgendwas">lllllink</a>

kannst du das Problem entdecken bzw. dein ansonsten sehr guter regulärer Ausdruck.

Gruß
Dominik
 
QUOTE (freakx0 @ Mo 19.9.2005, 17:07)[...]<a href="http://www.link.de" title="textirgendwas">lllllink</a>

kannst du das Problem entdecken bzw. dein ansonsten sehr guter regulärer Ausdruck.
[...]

Hier nochmal eine Verbesserung, das ensprechende Zeichen kann ich leider nicht markieren, da ich ein Leerzeichen hinzugefügt habe, dafür habe ich den Teilbereich markiert, welcher sich verändert hat:


QUOTE preg_match_all('/\<a(.*?)href=[\'"]((http|ftp)s?\:\/\/[^\/ ]*(\/[a-z0-9\/\-\._\%;,\?&\+\[\]\=]*)?)[\'"](.*?)\>(.*?)\<\/a\>/im', $eingabe, $ausgabe, PREG_SET_ORDER);


Leerzeichen gehören halt nicht in einen Link ;-)
Obwohl ich habe noch nie versucht einen Link in der Form zu schreiben:


HTML <a href=" http://www.domain.tld/ ">Mein Link</a>



MfG Sascha Ahlers
 
thx.

funktioniert nun.

QUOTE <a href=" http://www.domain.tld/ ">Mein Link</a>


naja, so war ja mein Link nicht ;-) war halt noch der title= dabei.

egal, nun funktionierts.

Gruß
Dominik
 
QUOTE (freakx0 @ Mo 19.9.2005, 17:23) [...]
naja, so war ja mein Link nicht ;-) war halt noch der title= dabei.
[...]

Ne, dieses Beispiel war nun etwas anderes gemeint, ob ein Browser diesen Link überhaupt richtig darstellt, na ja, ich kann es gleich mal ausprobieren. Natürlich funktioniert der Reguläre Ausdruck bei einer solchen Schreibweise nicht.

Das mit dem Problem bei den Title-Attribute habe ich mit bei der oben markierten Änderung behoben.


<edit>
Der oben genannte Link funktioniert zumindestens in Opera 8.01 und Firefox 1.0.4 ggf. müsste der Ausdruck dann halt wieder entsprechend angepass werden mit zwei \s* und weiter getestet werden, oder gleich innerhalb der href nur noch den Ausdruck als [^'"]* darstellen und diesen dann im zweiten Schritt überprüfen.
</edit>



MfG Sascha Ahlers
 
Danke, das Thema hat mir wirklich sehr weitergeholfen, aber leider habe ich noch ein Problem. Ich weiß nicht wie ich das jetzt von einer URL auslesen kann...

Ich dachte mir das Ganze so, aber klappt nicht so richtig (Warning: preg_match_all() expects parameter 2 to be string, resource given in "der preg_match_all Zeile"):


$eingabe = fopen($url,"r");

preg_match_all('/\<a(.*?)href=[\'"]((http|ftp)s?\:\/\/[^\/ ]*(\/[a-z0-9\/\-\._\%;,\?&\+\[\]\=]*)?)[\'"](.*?)\>(.*?)\<\/a\>/im', $eingabe, $ausgabe, PREG_SET_ORDER);

for( $i = 0; $i < count($ausgabe); $i++ ) {
echo 'URI: ' . $ausgabe[$i][2] . '<br />';
echo 'Linktext: ' . $ausgabe[$i][6] . '<br /><br />';
}
 
Hallo zusammen,

obwohl ich viel mit diesem Thread gelernt und gearbeitet habe komme ich doch nicht so recht weiter und würde daher gerne meine Frage mit anhängen.

Auch ich möchte URLs aus einem Text auslesen lassen und benötige eigentlich einen einfacheren Pattern da meine URLs einen festen Aufbau haben. Dies bekomme ich aber nicht hin. Zur Vereinfachung führe ich mal drei URLs wie Sie bei mir im Text vorkommen an:

1) http://www.allgemeines.info/aktiv.php?doma...e.vu&code=7114d

2) http://besonderes.com/aktiv.php?domain=blo...n.at&code=6654a

3) http://www.spezielles.de/aktiv.php?domain=....com&code=de44s


Somit haben meine URLs folgenden Aufbau:

http://(www)name.tld/aktiv.php?domain=IRGENDWAS1&code=IRGENDWAS2

Ich könnte also auf den umständlichen <a>-Tag-Abgleich verzichten und gleich mit http:// den Pattern beginnen. Wie schaffe ich das?

Viele Grüsse und vielen Dank,
Björn


 
<?php
error_reporting(E_ALL);

// Text bzw. String mit file_get_contents() holen
// andere Möglichkeit wäre mit fopen() oder CURL
$string = file_get_contents('http://www.ayom.de');

// das Suchmuster mit Delimiter und Modifer (falls vorhanden)
$pattern = '!<a.*href\="?(\S+)"([^>]*)>.+</a>!im';

// RegEx mit preg_match_all() auswerten
preg_match_all($pattern, $string, $array, PREG_OFFSET_CAPTURE);

// formatierte Ausgabe
echo '<pre>', print_r($array, true), '</pre>';

?>
http://www.regex-tester.de/regex.html
cool.gif

Grüsse halbesbit
wink.gif

 
Zurück
Oben