URLs durch HTML-Links ersetzen

cameeel

Erfahrenes Mitglied
Hi all,

vllt wurde das hier ja schon durchgenommen und ich hab auch die Forensuche benutzt aber wenn etwas dabei war, hab ichs net kapiert.

Mein Problem ist, das die Inhalte meiner neuen Homepage in einer DB stehen. Wenn ich die Variable "$Contetn" ausgebe, werden zunächst alle Zeilenumbrüche in "<br>" umgewandelt.

Das ist gut und soll auch so bleiben, nur will ich jetzt zusätzlich noch haben, das alle links , z.B. "www.domain.de" durch "<a href='http://www.domain.de' target='_blank'>www.domain.de</a>" ersetzt werden...

Ich weis das es mit preg_match_all gehen muss, nur hab ich immer das Problem das das Suchmuster für mich aussieht wie einer aneinanderreihung von Flüchen, z.B. sowas "/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", damit kann ich leider nix anfangen, gibts vllt ne Seite wo erklärt wird wie man solche Suchmuster schreibt oder kann mir einer sagen, wie das Suchmuster für mein Problem aussehen muss?


Danke,
cAm3eel
 
Re: preg_match_all - Links durch HTML-Links ersetzen

Wenn du etwas ersetzen willst, verwende [phpf]preg_replace[/phpf]
Code:
preg_replace('@http://(\S+)@','<a href="http://\\1" target="_blank">\\1</a>',$Contetn);

Zum Thema findest du hier ein Tutorial.
 
Re: preg_match_all - Links durch HTML-Links ersetzen

Mein Vorschlag:
PHP:
<?php

	$url_patterns = array(
		// @link	http://internet.ls-la.net/folklore/url-regexpr.html
		'http'		=> "(?:https?://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?)(?:/(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;:@&=])*)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;:@&=])*))*)(?:\?(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;:@&=])*))?)?)",
		'ftp'		=> "(?:ftp://(?:(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;?&=])*)(?::(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;?&=])*))?@)?(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?))(?:/(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[?:@&=])*)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[?:@&=])*))*)(?:;type=[AIDaid])?)?)",
		'mailto'	=> "(?:mailto:(?:(?:[a-zA-Z\d$\-_.+!*'(),;/?:@&=]|(?:%[a-fA-F\d]{2}))+))"
	);

	$pattern = '/(' . addcslashes($url_patterns['http'], chr(0x2F)) . '|' . addcslashes($url_patterns['ftp'], chr(0x2F)) . '|' . addcslashes($url_patterns['mailto'], chr(0x2F)) . ')/';
	$string = preg_replace($pattern, '<a href="\\1">\\1</a>', $string);

?>
Ist zwar etwas umfangreicher jedoch auch präziser, so wird beispielsweise das Wort „http://-Prafix“ nicht als URL erkannt.
 
Re: preg_match_all - Links durch HTML-Links ersetzen

Danke Gumbo, funktioniert perfekt!
Sven, dein Code hat leider nicht funktioniert, weis au net warum... (kam keine Fehlermeldung aber hat eben au net funktioniert...)

Nur versteht ich das Suchmuster in dem Code von Gumbo jetzt auch nicht, kann man das irgendwo lernen oder sowas?


MfG
cAm3eel
 
Re: preg_match_all - Links durch HTML-Links ersetzen

Beide Vorschläge basieren auf regulären Ausdrücken. Diese scheinen auf der ersten Blick sehr kryptisch, sind jedoch nach einiger Übung schnell zu durchschauen. Übrigens stammt der von mir benutzte reguläre Ausdruck nicht aus meiner Feder, sondern ist eine ausgesuchte Kopie des kompletten regulären Ausdrucks eines URL.

Bei der Findung eines regulären Ausdrucks kann übrigens der „Regex Coach“ sehr hilfreich sein.
 
Re: preg_match_all - Links durch HTML-Links ersetzen

Danke, der erste Link hat sehr geholfen, jetzt kapier ichs glaub ein bissel, thx.


cAm3eel
 
preg_match_all - Links durch HTML-Links ersetzen

Hi Leute,

ich hab gedacht ich benutze diesen Thread da er sowieso zum Thema passt ...
also ich habe eine Funktion geschrieben, die einen String nach URL's durchsucht, wie hier ja schon beschrieben wurde, danach werden alle gefundenen URL's in HTML-Links umgewandelt, die Funktion sieht dann so aus:


PHP:
<?php

function urlhighlight($str) {

$pre_pattern = "(?:https?://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?)(?:/(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;:@&=#])*)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;:@&=#])*))*)(?:\?(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;:@&=#])*))?)?)";

   $pattern = "/".addcslashes($pre_pattern, chr(0x2F))."/is";

	preg_match_all($pattern,$str,$lnk);
	$size = sizeof($lnk[0]);
	$i = 0;
	while ($i < $size) {
		$len = strlen($lnk[0][$i]);
		if($len > 63) {
			$lnk_txt = substr($lnk[0][$i],0,30)." \[...\] ".substr($lnk[0][$i],-30,30);
		} else {
			$lnk_txt = $lnk[0][$i];
		}
		$ahref = $lnk[0][$i];
		
		$str = str_replace($ahref,"<a href=\"".$ahref."\">$lnk_txt</a>",$str);

		$i++;
		
	}
	return $str;
}

... das funktioniert ja dann auch ganz gut, solang bis der zu durchsuchende string zwei Adressen enthält, von denen die eine bestandteil der anderen ist ... hört sich sehr unwahrscheinlich an, ist es wahrscheinlich auch, ich hab es aber beim testen gemerkt und doch noch ein wahrscheinliches Beispiel gefunden ...

angenommen der User schreibt zwei Adressen seiner Homepage in den string

PHP:
$string = "blabla meine website: http://www.atcq.de und meine website: http://www.atcq.de/wap"

dann bekomm ich das ergebnis:

HTML:
meine website: <a href="http://www.atcq.de">http://www.atcq.de</a> und meine website: <a href="http://www.atcq.de">http://www.atcq.de</a>/wap

also beim erstenmal werden beide vorkommen von http://www.atcq.de ersetzt also auch in http://www.atcq.de/wap und die URL http://www.atcq.de/wap zerfetzt ... schlimmer ist es noch wenn http://www.atcq.de/wap vor http://www.atcq.de kommt ... dann wird http://www.atcq.de in
HTML:
<a href="http://www.atcq.de/wap">
und in <a href="...">http://www.atcq.de/wap</a> ersetzt!

hoffe das war einigermaßen verständlich ...

hat jmd. ne Idee wie ich das verhindern kann?

Grüße und schonmal Danke
 
Mein Vorschlag:
PHP:
function html_parseURLs( $str, $limit=false )
{
	$subPattern = "(?:https?://(?:(?:(?:(?:(?:[a-zA-Z\d](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?)\.)*(?:[a-zA-Z](?:(?:[a-zA-Z\d]|-)*[a-zA-Z\d])?))|(?:(?:\d+)(?:\.(?:\d+)){3}))(?::(?:\d+))?)(?:/(?:(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;:@&=#])*)(?:/(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;:@&=#])*))*)(?:\?(?:(?:(?:[a-zA-Z\d$\-_.+!*'(),]|(?:%[a-fA-F\d]{2}))|[;:@&=#])*))?)?)";
	if( !$limit ) {
		return preg_replace('/'.addcslashes($subPattern, '/').'/eis', 'html_shortenURL("\0")', $str);
	} else {
		return preg_replace('/'.addcslashes($subPattern, '/').'/eis', 'html_shortenURL("\0", '.$limit.')', $str);
	}
}
function html_shortenURL( $url, $limit=false )
{
	if( !$limit ) {
		return $url;
	}
	$return = '<a href="'.htmlspecialchars($url).'">';
	if( $limit < strlen($url) ) {
		$return .= htmlspecialchars(substr($url, 0, floor($limit/2))) . '…' . htmlspecialchars(substr($url, ceil($limit/2)*-1));
	} else {
		$return .= htmlspecialchars($url);
	}
	return $return . '</a>';
}
 
cool, das ging ja schnell ... ich werd es heut abend mal ausprobieren und versuchen zu verstehen ... vielen dank!
 
Zurück