[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
externe Links kennzeichnen mit OUTPUT_FILTER + RegEx - REDAXO Forum
Hallo,

Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen und besseren Möglichkeiten der Kommunikation haben wir uns entschlossen das Forum nur noch als Archiv zur Verfügung zu stellen. Somit bleibt es weiterhin möglich hier nach Lösungen zu suchen. Neue Beiträge können nicht mehr erstellt werden.

Wir empfehlen, für deine Fragen/Probleme Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt :-)
Selbst einladen kannst Du dich hier: https://redaxo.org/slack/
Benutzeravatar
RedFox
Beiträge: 142
Registriert: 21. Feb 2006, 13:00
Wohnort: downtown munich
Kontaktdaten: Website

externe Links kennzeichnen mit OUTPUT_FILTER + RegEx

6. Apr 2006, 08:58

hi,

ich möchte auf meiner seite jeden externen Link kennzeichnen mit einer css-klasse .external. dazu habe ich im netz einen einen passenden code gefunden der mir diese liefert:

Code: Alles auswählen

<?php

$url = "http://localhost/";

function rex_external_links($url, $mode = 1) {
	$content = implode("", file($url));

	if(empty($content)) return false;

	$parsed = parse_url($url);

	$uri  = $parsed['scheme'] ? $parsed['scheme'].':'.((strtolower($parsed['scheme']) == 'mailto') ? '':'//'): '';
	$uri .= $parsed['user']   ? $parsed['user'].($parsed['pass']? ':'.$parsed['pass']:'').'@':'';
	$uri .= $parsed['host']   ? $parsed['host'] : '';     $uri .= $parsed['port']   ? ':'.$parsed['port'] : '';
	
	if(!preg_match_all("/<a[^>]*hrefs*=s*(\"|')(.*?)(\"|')[^>]*>(.*?)</a>/ims", $content, $matches)) return false;

	$data = $matches[2];

	if($mode!=1) {
		if($mode==2) {
			foreach($data as $key => $link) {
				if(!preg_match("|^[a-z]+://|i", $link) || preg_match("|^".$uri."|i", $Link)) unset($data[$key]);
			}
		}
		if($mode==3) {
			foreach($data as $key => $link) {
				if(preg_match("|^[a-z]+://|i", $link) || preg_match("|^".$uri."|i", $Link)) unset($data[$key]);
			}
		}
	}

	return $data;
}


echo "Alle Links, intern und extern :<br>";

$links = getLinks($url);
foreach($links as $key => $val) echo "$key => $val<br>n";

echo "<br><br>Nur externe Links :<br>";

$links = getLinks($url,2);
foreach($links as $key => $val) echo "$key => $val<br>n";

echo "<br><br>Nur interne Links :<br>";

$links = getLinks($url,3);
foreach($links as $key => $val) echo "$key => $val<br>n";


?>
dieser liefert mit §mode = 2 alle externen links einer seite. nun möchte ich das so anpassen, dass es mit dem OUTPUT_FILTER von redaxo zusammen spielt, wie auch beim encrypt_mails template.

ich steh da grad ein wenig auf dem schlauch und könnte ne kleine hilfestellung gebrauchen, wie ich das anzupassen habe.
danke.

Benutzeravatar
RedFox
Beiträge: 142
Registriert: 21. Feb 2006, 13:00
Wohnort: downtown munich
Kontaktdaten: Website

6. Apr 2006, 10:09

hab grade bemerkt dass ich den code gar nicht so genau brauche, da ja die internen links sowieso relativ generiert werden, also ohne http:// gedöns.
ich bräuchte also nur eine abfrage über http:// links denen ich dann meine klasse anhänge ...

Benutzeravatar
Thomas.Blum
Entwickler
Beiträge: 5063
Registriert: 24. Aug 2004, 22:11
Wohnort: Dresden
Kontaktdaten: Website

6. Apr 2006, 12:46

Hej,

wenn du nur nach http:// suchen willst, also keine genaue Url-Überpüfung machen willst, dann nimm das Output-Filter-Addon.

Einfach alle

href="http://"

mit

class="external" href="http://"

ersetzen.

Ich würde aber die RegExp vorziehen.

viele Grüße

Thomas

Benutzeravatar
RedFox
Beiträge: 142
Registriert: 21. Feb 2006, 13:00
Wohnort: downtown munich
Kontaktdaten: Website

6. Apr 2006, 14:15

puh...

es ist vollbracht,

einbinden im benutzten Template über:

Code: Alles auswählen

$external_links_TemplateId = "ID_des_Templates";
include $REX['INCLUDE_PATH']."/generated/templates/$external_links_TemplateId.template";
hier das template selber:

Code: Alles auswählen

<?php
if (!$REX['REDAXO'])
	rex_register_extension('OUTPUT_FILTER', 'rex_external_links');
	
	function rex_external_links($params) {
		$content = $params['subject'];
		
		// hier via regEx alle absoluten Linkadressen heraussuchen
		preg_match_all("/<a[^>]*(href\s*=\s*(\"|')(http(s)?|ftp(s)?|telnet|irc)(?=:\/\/).*?(\"|'))[^>]*>(.*?)<\/a>/ims",$content,$matches);

		// hier jetzt alle gefundenen durchgehen und erweitern
		if ( isset ($matches[0][0]) and $matches[0][0] != '') {
			for ($m = 0; $m < count ($matches[0]); $m++) {
				$external_link = "";
				$external_link .= $matches[1][$m];
				$external_link .= ' onclick="window.open(this.href); return false;" class="extern"';
				// javascript für neues Fenster, class für Kennzeichnung
				$content = str_replace($matches[1][$m],$external_link,$content);
			}
		}
		return $content;
	}
?>
bitte mal drüberschauen wer lust hat ob das alles so hinhaut, ich hab jedenfalls keine bugs mehr gefunden...
falls nix mehr kommt stell ich es noch mit beschreibung in den downloadbereich.
mfg
Zuletzt geändert von RedFox am 6. Apr 2006, 16:40, insgesamt 4-mal geändert.

Benutzeravatar
Markus.Staab
Entwickler
Beiträge: 9634
Registriert: 29. Jan 2005, 15:50
Wohnort: Aschaffenburg/Germany
Kontaktdaten: ICQ Website

6. Apr 2006, 14:38

Hi,

was mir jetzt auf den ersten Blick auffällt ist, das keine HTTPS und FTPS links berücksichtigt werden... Evtl sollte man noch weitere Protokolle mit aufnehmen (Telnet, IRC,...)

Gruß,
Markus

Benutzeravatar
RedFox
Beiträge: 142
Registriert: 21. Feb 2006, 13:00
Wohnort: downtown munich
Kontaktdaten: Website

6. Apr 2006, 14:47

https und ftps machts schon, weil die ja http/ftp enthalten,
für telnet und irc hab ichs oben mal editiert

Benutzeravatar
Thomas.Blum
Entwickler
Beiträge: 5063
Registriert: 24. Aug 2004, 22:11
Wohnort: Dresden
Kontaktdaten: Website

6. Apr 2006, 15:21

Hej,

Ja und auch httpirgendwas

leider sucht die nach möglichen Urls nicht nach richtigen Urls.

vg Thomas

Benutzeravatar
RedFox
Beiträge: 142
Registriert: 21. Feb 2006, 13:00
Wohnort: downtown munich
Kontaktdaten: Website

6. Apr 2006, 15:54

habs nochmals angepasst, diese fälle dürften jetzt nicht mehr erkannt werden.

Benutzeravatar
Markus.Staab
Entwickler
Beiträge: 9634
Registriert: 29. Jan 2005, 15:50
Wohnort: Aschaffenburg/Germany
Kontaktdaten: ICQ Website

6. Apr 2006, 16:27

Hi,

mach doch

http(s)?

:)

Gruß,
Markus

Benutzeravatar
RedFox
Beiträge: 142
Registriert: 21. Feb 2006, 13:00
Wohnort: downtown munich
Kontaktdaten: Website

6. Apr 2006, 16:39

stimmt hast ja recht, den halben tag regexp und mein kopf is ganz durchwurschtelt. -> angepasst.

aber hat sich gelohnt, da nun auch mit textile die externe links automatisch gekennzeichnet und in dem fall als neues fenster geöffnet werden (das js kann man ja rausnehmen wers nicht möchte).

Benutzeravatar
Thomas.Blum
Entwickler
Beiträge: 5063
Registriert: 24. Aug 2004, 22:11
Wohnort: Dresden
Kontaktdaten: Website

6. Apr 2006, 16:39

Hej,
kills hat geschrieben:mach doch

http(s)?
warum nicht gleich

(ht|f)tps?

vg Thomas

Benutzeravatar
RedFox
Beiträge: 142
Registriert: 21. Feb 2006, 13:00
Wohnort: downtown munich
Kontaktdaten: Website

6. Apr 2006, 18:00

jo, stimmt auch wieder.

hab selber nochwas gefunden:

wenn im content genau der gleiche, auf jedes zeichen exakte link mehrmals vorkommt, wird bei allen exakten links das anhängsel mehrfach angehängt. also:

2 exakte links -> 2 mal anhängsel
3 exakte links -> 3 mal anhängsel
usw...

ich glaub zwar nicht dass das in der realität absichtlich vorkommt, aber ich hätte es trotzdem gern rausgebuggt. kann mir da jemand auf die sprünge helfen, wo die ursache dafür ist?.
danke.

Benutzeravatar
Thomas.Blum
Entwickler
Beiträge: 5063
Registriert: 24. Aug 2004, 22:11
Wohnort: Dresden
Kontaktdaten: Website

6. Apr 2006, 18:06

Hej,

gib mal bitte Beispieltext. Also

Das ist ok:

Das ist nicht ok:

vg Thomas

Benutzeravatar
RedFox
Beiträge: 142
Registriert: 21. Feb 2006, 13:00
Wohnort: downtown munich
Kontaktdaten: Website

6. Apr 2006, 19:18

ok also so:

ich habe einen text und irgendwo da sind 2 identische links:

Code: Alles auswählen

...
<a href="http://www.redaxo.de/">redaxo</a>
...
...
...
<a href="http://www.redaxo.de/">redaxo</a>
...
dann liefert mir das template:

Code: Alles auswählen

...
<a href="http://www.redaxo.de/" class="extern" class="extern">redaxo</a>
...
...
...
<a href="http://www.redaxo.de/" class="extern" class="extern">redaxo</a>
...
also 2 mal angehängt bei beiden links.

bei 3 identischen links wirds analog 3 mal angehängt bei den 3 links usw.

das hätt ich gern eliminert.

Benutzeravatar
Markus.Staab
Entwickler
Beiträge: 9634
Registriert: 29. Jan 2005, 15:50
Wohnort: Aschaffenburg/Germany
Kontaktdaten: ICQ Website

6. Apr 2006, 20:37

Hi,

jaja, da kommen die RegEx Könige herausgekrochen ;)

Zum Thema:
Bau doch was ein ala

Code: Alles auswählen

if(strpos($haystack,'class="extern"') === false)
Gruß,
Markus

Benutzeravatar
RedFox
Beiträge: 142
Registriert: 21. Feb 2006, 13:00
Wohnort: downtown munich
Kontaktdaten: Website

7. Apr 2006, 12:49

Bau doch was ein ala

Code: Alles auswählen

if(strpos($haystack,'class="extern"') === false)
jo sollte man meinen, aber es tuts nicht hab es an den unterschiedlichsten stellen mit unterschiedlichen inputparametern versucht, aber kein erfolg. ich krieg das mehrfach anhängen bei identischen links nicht weg.

muss das jetzt wohl oder übel erstmal so lassen, vielleicht fällt ja dem ein oder anderen noch der entscheidende hinweis ein, so möge er ihn mir bitte mitteilen.

danke.

Benutzeravatar
RedFox
Beiträge: 142
Registriert: 21. Feb 2006, 13:00
Wohnort: downtown munich
Kontaktdaten: Website

22. Jun 2006, 14:43

So das template ist fertig und evtl. doppellinks werden mittels array_unique() rausgeschmissen.

aktuelle version: http://www.redaxo.de/168-Templatedetail ... late_id=25

minime
Beiträge: 46
Registriert: 8. Nov 2007, 15:11

doppelte links

11. Jan 2008, 17:48

Hallo zusammen,

ich verwende erfolgreich dieses tolle Template, um externe Links zu kennzeichen. Funktioniert auch, bis auf 2 Probleme:

1. Ich habe öfters die Situation, dass 2 exakt gleiche Links in einem Content vorkommen (z.B. als verlinkte Überschrift und dann nochmal im Text darunter). Hat vielleicht jemand das in den vorigen Posts beschriebene Problem mit den doppelten Links gelöst? So wird nämlich immer nur der erste Link als extern gekennzeichnet :(

2. Überschriften die externe Links sind sollen keinen Pfeil erhalten. Ich kenne mich nicht so mir RegEx aus. Weiss jemand ob und wie ich das da einbauen kann??

Ich freue mich über jede Hilfe.

Viele Grüße, minime

Benutzeravatar
katharina
Beiträge: 61
Registriert: 28. Jan 2006, 15:08

15. Jun 2008, 16:27

Was muß man tun, damit das auch in der 4-er Version läuft??? Ich nutze das Template nämlich auch gerne.
Danke & Gruß!
Katharina

Thomas.Skerbis
Beiträge: 1371
Registriert: 4. Aug 2006, 14:06
Wohnort: Rheinberg
Kontaktdaten: Website Twitter

16. Jun 2008, 23:21

hmm... sehe kein Problem im Einsatz mit Redaxo 4.x.
Du kannst es aber auch gerne mal mit diesem versuchen:
http://www.redaxo.de/168-Templatedetail ... late_id=91

Benutzeravatar
katharina
Beiträge: 61
Registriert: 28. Jan 2006, 15:08

17. Jun 2008, 08:50

Vielen Dank, so geht es!!! Wird wohl irgendwas mit dem Aufruf im Template zu tun haben.

Benutzeravatar
Richard.Laing
Beiträge: 2105
Registriert: 28. Aug 2005, 00:55
Wohnort: Brühl / Rheinland
Kontaktdaten: Website

1. Jun 2010, 09:52

hi@all

ich nutze das template exerne links

kann mir jemand sagen wie ich einen speziellen externen link ausschliessen kann?

damit ich diesen link in der shadowbox aufgehen lassen kann.??

also die class="extern" darf nur an diesem einen link nicht greifen...??

danke für jede hilfe

gruß richy

EDIT
Hups falsche Kategorie nutze REDAXO 4.2.1
REXvideo Videotutorials für Redaxo www.REXvideo.de
Webseite www.on-laing.de smokezig.de www.smokezig.de

Zurück zu „Allgemeines [R3]“