externe Links kennzeichnen mit OUTPUT_FILTER + RegEx

Wie verwendet man Templates oder erstellt Navigationen und passt diese an.

externe Links kennzeichnen mit OUTPUT_FILTER + RegEx

Beitragvon RedFox » 6. Apr 2006, 07: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: 145
Registriert: 21. Feb 2006, 12:00
Wohnort: downtown munich

Beitragvon RedFox » 6. Apr 2006, 09: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
RedFox
 
Beiträge: 145
Registriert: 21. Feb 2006, 12:00
Wohnort: downtown munich

Beitragvon Thomas.Blum » 6. Apr 2006, 11: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
blumbeet - web.studio - Dresden - 0351 217 6225
webbude - Blog über CSS.XHTML.REX
Ein Wunschzettel
Benutzeravatar
Thomas.Blum
Entwickler
 
Beiträge: 4669
Registriert: 24. Aug 2004, 21:11
Wohnort: Dresden

Beitragvon RedFox » 6. Apr 2006, 13: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, 15:40, insgesamt 4-mal geändert.
Benutzeravatar
RedFox
 
Beiträge: 145
Registriert: 21. Feb 2006, 12:00
Wohnort: downtown munich

Beitragvon Markus.Staab » 6. Apr 2006, 13: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
Markus.Staab
Entwickler
 
Beiträge: 9781
Registriert: 29. Jan 2005, 14:50
Wohnort: Aschaffenburg/Germany

Beitragvon RedFox » 6. Apr 2006, 13:47

https und ftps machts schon, weil die ja http/ftp enthalten,
für telnet und irc hab ichs oben mal editiert
Benutzeravatar
RedFox
 
Beiträge: 145
Registriert: 21. Feb 2006, 12:00
Wohnort: downtown munich

Beitragvon Thomas.Blum » 6. Apr 2006, 14:21

Hej,

Ja und auch httpirgendwas

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

vg Thomas
blumbeet - web.studio - Dresden - 0351 217 6225
webbude - Blog über CSS.XHTML.REX
Ein Wunschzettel
Benutzeravatar
Thomas.Blum
Entwickler
 
Beiträge: 4669
Registriert: 24. Aug 2004, 21:11
Wohnort: Dresden

Beitragvon RedFox » 6. Apr 2006, 14:54

habs nochmals angepasst, diese fälle dürften jetzt nicht mehr erkannt werden.
Benutzeravatar
RedFox
 
Beiträge: 145
Registriert: 21. Feb 2006, 12:00
Wohnort: downtown munich

Beitragvon Markus.Staab » 6. Apr 2006, 15:27

Hi,

mach doch

http(s)?

:)

Gruß,
Markus
Benutzeravatar
Markus.Staab
Entwickler
 
Beiträge: 9781
Registriert: 29. Jan 2005, 14:50
Wohnort: Aschaffenburg/Germany

Beitragvon RedFox » 6. Apr 2006, 15: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
RedFox
 
Beiträge: 145
Registriert: 21. Feb 2006, 12:00
Wohnort: downtown munich

Beitragvon Thomas.Blum » 6. Apr 2006, 15:39

Hej,
kills hat geschrieben:mach doch

http(s)?


warum nicht gleich

(ht|f)tps?

vg Thomas
blumbeet - web.studio - Dresden - 0351 217 6225
webbude - Blog über CSS.XHTML.REX
Ein Wunschzettel
Benutzeravatar
Thomas.Blum
Entwickler
 
Beiträge: 4669
Registriert: 24. Aug 2004, 21:11
Wohnort: Dresden

Beitragvon RedFox » 6. Apr 2006, 17: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
RedFox
 
Beiträge: 145
Registriert: 21. Feb 2006, 12:00
Wohnort: downtown munich

Beitragvon Thomas.Blum » 6. Apr 2006, 17:06

Hej,

gib mal bitte Beispieltext. Also

Das ist ok:

Das ist nicht ok:

vg Thomas
blumbeet - web.studio - Dresden - 0351 217 6225
webbude - Blog über CSS.XHTML.REX
Ein Wunschzettel
Benutzeravatar
Thomas.Blum
Entwickler
 
Beiträge: 4669
Registriert: 24. Aug 2004, 21:11
Wohnort: Dresden

Beitragvon RedFox » 6. Apr 2006, 18: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
RedFox
 
Beiträge: 145
Registriert: 21. Feb 2006, 12:00
Wohnort: downtown munich

Beitragvon Markus.Staab » 6. Apr 2006, 19: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
Markus.Staab
Entwickler
 
Beiträge: 9781
Registriert: 29. Jan 2005, 14:50
Wohnort: Aschaffenburg/Germany

Nächste

Zurück zu Templates/Navigationen [R3]

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast