Links automatisch ersetzen und Header auslesen

Klein0r

Erfahrenes Mitglied
Hallo zusammen ;)

Hat von euch irgendjemand einen fertigen regulären Ausdruck/eine Funktion der sämtliche Links die in einem Text vorhanden sind durch Links ersetzt (<a href="...">). Ich weiß leider nicht wie man das realisieren könnte. Sicher wird es Lösungen mit preg_match/preg_replace etc geben aber ich bin nicht so gut darin reguläre Ausdrücke zu schreiben die sämtliche Formen von Links erkennen würden. Und sowas findet man ja in jedem zweiten Script denke ich.

Des weiten würde ich gerne wissen wie man es am besten lösen könnte, dass man aus einer gegebenen Adresse den Titel herausbekommt und anzeigt. (Wie hier im Forum glaube auch).
Also wenn ich einen Link einfüge will ich nicht das da http://..... als Link steht, sondern der Title der auf der jeweiligen Seite angezeigt würde.

Macht es Sinn mit einem open und get den ganzen Quelltext zu lesen und dann den Titel zu filtern oder gibt es da einfachere Lösungen?

lg
 
...sämtliche Links die in einem Text vorhanden sind durch Links ersetzt (<a href="...">)

Meinst Du das Verweisziel, auf das href verweist, oder inkl dem Text innerhalb der a-Elemente?

Zum zweiten: um ein fopen() der Datei und Auslesen innerhalb des titel-Elements wirst du nicht rumkommen. Solange das einmalig für jede Adresse gemacht wird, ist das doch auch kein Problem, denk ich.
 
Also ich schreibe einfach nur eine Textbox:

Code:
Hallo Leute, ihr müsst unbedingt mal Folgende Seite sehen: http://www.google.de
Und die Seite www.tutorials.de ist auch super!

Nun würde das ja einfach so beim auslesen ausgegeben. Ich möchte nun das er die Links ersetzt:

Code:
Hallo Leute, ihr müsst unbedingt mal Folgende Seite sehen: <a href="http://www.google.de" target="_blank">http://www.google.de</a>
Und die Seite <a href="http://www.tutorials.de" target="_blank">www.tutorials.de</a> ist auch super!

Das Problem ist dabei ja, das alle links erkannt werden müssen. Also:
Code:
www.test.de
www2.test.de
http://test.de
http://www.test.de
www.test.de/hallo.html
www.test.de/123/456/789/seite.php
www.test.de/123/456/789/seite.php?test=ja&nichts=1
http://www.test.de/hallo.html
http://test.de/123/456/789/seite.php
http://www.test.de/123/456/789/seite.php?test=ja&nichts=1

Es gibt ja relativ viele Formen sag ich mal.

Schritt 2 wäre dann die Links folgendermaßen zu ersetzen (mit Header auslesen):
Code:
Hallo Leute, ihr müsst unbedingt mal Folgende Seite sehen: http://images.google.de/imghp?hl=de&tab=wi

und durch folgendes ersetzen:
Code:
Hallo Leute, ihr müsst unbedingt mal Folgende Seite sehen: <a href="http://images.google.de/imghp?hl=de&tab=wi" target="_blank">Google Bilder</a>

Ich hoffe ihr könnt mir folgen ;)
 
Hey danke!

Das mit dem Header auslesen war genau das richtige! Allerdings kann ich mit dem anderen Linkt nicht soviel anfangen. Der prüft soweit ich das verstehe nur, ob es eine gültige Adresse zu einem Bild ist!
 
Probleme gelöst!

Habe ne Funktion gefunden für die Links:
PHP:
// Wandelt in einem Text alle Links um
function getlinks($link)
{
	$link = str_replace("http://www.","www.", $link);
	$link = str_replace("www.","http://www.", $link);
	$link = preg_replace("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i","[ URL=$1]$1[ /URL]", $link);
	$link = preg_replace("/([\w-?&;#~=\.\/]+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?))/i","<a href=\"mailto:$1\">$1</a>", $link);

	return $link;
}

Und zur Vollständigkeit für die Title:
PHP:
function getPageTitle($page) {
	$file = fopen ($page, "r");
	if (!$file) {
	    exit;
	}
	while (!feof ($file)) {
	    $line = fgets ($file, 1024);
	    if (eregi ("<title>(.*)</title>", $line, $out)) {
	        $title = $out[1];
	        break;
	    }
	}
	fclose($file);
	
	return $title;
}

Bitte nicht wundern - ich übersetze das natürlich in bbCode ;)
Allerdings weiß ich noch nicht wie ich die Beiden funktionen sinnvoll verknüpfe! Um das $1 einfach den anderen Funktionsaufruf machen geht ja leider nicht :(
Naja muss ich mir noch was schlaues überlegen ;)
 
Zuletzt bearbeitet:
Wird nicht gehen - getLinks bezieht sich auf den ganzen Text und getPageTitle auf genau einen Link in diesem Text.

Also wenn müsste man versuchen den getPageTitle direkt mit ein zu bauen!

Folgendes Codebeispiel zeigt wie ich es mir vorstelle, es aber NICHT funktioniert:

PHP:
// Wandelt in einem Text alle Links um
function getlinks($link)
{
	$link = str_replace("http://www.","www.", $link);
	$link = str_replace("www.","http://www.", $link);
	$link = preg_replace("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i","[ URL=$1]".getPageTitle($1)."[ /URL]", $link);
	$link = preg_replace("/([\w-?&;#~=\.\/]+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?))/i","<a href=\"mailto:$1\">$1</a>", $link);

	return $link;
}

Weiß jemand wie man das umsetzen könnte? Oder muss ich die $1 noch in hochkomma setzen? Ich steh gerade ein wenig aufm Schlauch... Habe das mit Hochkomma noch nicht versucht und und ich glaube das klappt eher als so... Heute Nachmittag bin ich schlauer!

Bis dahin bin ich für alle Ideen offen ;)
(Ich hoffe diesmal wird der BB-Code im Quelltext nicht erkannt...)
 
So,

ich habe noch ein wenig rumgespielt und es wär doch gelacht wenn ich das nich geschafft hätte ;)

Hier meine Lösung damit das Teil nur einmal ausgelesen wird und nicht bei jedem Seitenaufbau:

PHP:
// Wandelt in einem Text alle Links um
function getlinks($link)
{
	$pattern = '/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i';

	$link = str_replace("http://www.","www.", $link);
	$link = str_replace("www.","http://www.", $link);
	$link = preg_replace_callback($pattern, 'getPageTitle', $link);
	$link = preg_replace("/([\w-?&;#~=\.\/]+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?))/i","<a href=\"mailto:$1\">$1</a>", $link);
	
	return $link;
}

function getPageTitle($page) {
	
	$file = @fopen ($page[0], "r");
	if ($file) {
		while (!feof($file)) {
			$line = fgets ($file, 1024);
			/* This only works if the title and its tags are on one line */
			if (eregi ("<title>(.*)</title>", $line, $out)) {
				$title = $out[1];
				break;
			}
		}
		fclose($file);
	}
	
	return '[ URL='.$page[0].']'.$title.'[ /URL]';
}

Alternativ geht auch:
PHP:
// Wandelt in einem Text alle Links um
function getlinks($link)
{
	$pattern = '/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i';
	
	$link = str_replace("http://www.","www.", $link);
	$link = str_replace("www.","http://www.", $link);
    $link = preg_replace_callback(
        $pattern,
        create_function(
            '$matches',
            'return getPageTitle($matches[0]);'
        ),
        $link
    );
	$link = preg_replace("/([\w-?&;#~=\.\/]+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?))/i","<a href=\"mailto:$1\">$1</a>", $link);
	
	return $link;
}

function getPageTitle($page) {
	
	$file = @fopen ($page, "r");
	if ($file) {
		while (!feof($file)) {
			$line = fgets ($file, 1024);
			if (eregi ("<title>(.*)</title>", $line, $out)) {
				$title = $out[1];
				break;
			}
		}
		fclose($file);
	}
	
	return '[ URL='.$page.']'.$title.'[ /URL]';
}

Das Ergebnis ist bei beiden gleich
Eingabe:
Code:
www.klein0r.de

www.google.de oder http://www.giga.de

Dadurch enstandender BB-Code:
Code:
[ URL=http://www.klein0r.de]Welcome 2 klein0r.de[ /URL]

[ URL=http://www.google.de]Google[ /URL] oder [ URL=http://www.giga.de]GIGA - Digital Entertainment and Gaming TV[ /URL]

Ergebnis nach parsen des BB-Codes:
Code:
Welcome 2 klein0r.de

Google oder GIGA - Digital Entertainment and Gaming TV
Natürlich sind alles Links ;)

Viel Spaß damit und Thema abgehakt!
 
Hallo - ich habe nochmal eine Frage zu den letzten Lösungen von mir:

Wie kann ich verhindern, dass Links innerhalb von [IMG]-Tags ersetzt werden?! Ich bin leider nicht so fit in regulären Ausdrücken und habe keine Ahnung wie man das angehen könnte.

Vllt reicht es auch einfach wenn man die Ausdruck so verändert, dass vor und nach dem Link ein Leerzeichen sein muss.

Hoffe auf kreative Vorschläge ;)

lg
 
Zurück