kostenloser Webspace werbefrei: lima-city


Alle Mailadressen ersetzen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    fabo

    fabo hat kostenlosen Webspace.

    Guten Morgen,

    nachdem ich mich nun den halben Tag ergebnislos damit abgequält habe, muss ich euch leider mit einem weiteren Anliegen nerven. Denn es gibt parallel zum obigen Format noch zwei Dinge, die ich mit einbringen würde:

    - E-Mail Adressen, die nicht über mailto verlinkt werden:

    <a href="http://domain.tld">foo@bar.tld</a>


    - E-Mail Adressen, die nicht verlinkt sind

    Egal, was ich versuche. Ich zerschieße mir alle Hyperlinks auf der Seite :(
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. das $regex-pattern der lösung, die hackyourlife der welt geschenkt hat, zielt nur auf mailto-links
    und das $mail-pattern nur auf mail-adressen!?

    inwiefern werden die anderen links zerschossen? hast du noch weiteren code drangebastelt?
    details bitte... :wink:
  4. Autor dieses Themas

    fabo

    fabo hat kostenlosen Webspace.

    das $regex-pattern der lösung, die hackyourlife der welt geschenkt hat, zielt nur auf mailto-links
    und das $mail-pattern nur auf mail-adressen!?


    Richtig. Ist ja auch gut so, funktioniert wie gewollt.

    inwiefern werden die anderen links zerschossen?


    Ich kriege das Pattern nicht hin und ersetze in den meisten Versuchen alle Hyperlinks auf der Seite, anstatt die Mailadressen, die möglicherweise in deren Content enthalten sind :D

    hast du noch weiteren code drangebastelt?


    Jein. Eher für meine Bedürfnisse angepasst. Aber das ist unabhängig von meinem Problem.
  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Wie soll das jetzt genau ablaufen? Alle Mail-Adressen umdrehen und bei Mailto-Links in den base64-Link umwandeln? Das ginge sehr einfach:
    <?php
    
    header('content-type: text/plain');
    
    $input = <<< ETX
    <a href="mailto:foo@bar.tld">foo@bar.tld</a>
    <a href="mailto:foo@bar.tld">Hallo World foo@bar.tld <img src="bild.ext" /></a>
    <a href="mailto:foo@bar.tld">Email</a>
    <a href="mailto:foo@bar.tld">bar@foo.tld</a>
    <a class="bla" href="mailto:foo@bar.tld" title="xyz">bar@foo.tld</a>
    <a href="http://domain.tld">foo@bar.tld</a>
    ETX;
    
    
    $regex = '/<a (.*)href=([\'"])mailto:(.+)\\2([^>]*)>(.*)<\/a>/U';
    $mail = '/\\b[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}\\b/';
    
    function emailcallback($match) {
    	return strrev($match[0]);
    }
    
    function callback($match) {
    	global $mail;
    	$b64 = base64_encode($match[3]);
    	return "<a {$match[1]}href=\"x.php?a=$b64\"{$match[4]}>{$match[5]}</a>";
    }
    
    $output = preg_replace_callback($mail, 'emailcallback', preg_replace_callback($regex, 'callback', $input));
    
    echo(<<< ETX
    INPUT:
    $input
    
    ====
    
    OUTPUT:
    $output
    ETX
    );
    Output:
    INPUT:
    <a href="mailto:foo@bar.tld">foo@bar.tld</a>
    <a href="mailto:foo@bar.tld">Hallo World foo@bar.tld <img src="bild.ext" /></a>
    <a href="mailto:foo@bar.tld">Email</a>
    <a href="mailto:foo@bar.tld">bar@foo.tld</a>
    <a class="bla" href="mailto:foo@bar.tld" title="xyz">bar@foo.tld</a>
    <a href="http://domain.tld">foo@bar.tld</a>
    
    ====
    
    OUTPUT:
    <a href="x.php?a=Zm9vQGJhci50bGQ=">dlt.rab@oof</a>
    <a href="x.php?a=Zm9vQGJhci50bGQ=">Hallo World dlt.rab@oof <img src="bild.ext" /></a>
    <a href="x.php?a=Zm9vQGJhci50bGQ=">Email</a>
    <a href="x.php?a=Zm9vQGJhci50bGQ=">dlt.oof@rab</a>
    <a class="bla" href="x.php?a=Zm9vQGJhci50bGQ=" title="xyz">dlt.oof@rab</a>
    <a href="http://domain.tld">dlt.rab@oof</a>
    Dabei werden Mail-Adressen aber überall umgedreht, also auch außerhalb von Links.
  6. Autor dieses Themas

    fabo

    fabo hat kostenlosen Webspace.

    Nabend,

    das ist schon fast perfekt :D Einen Fehler hat das Ganze jedoch:

    <a href="http://domain.tld?x=foo@bar.tld">bla</a>


    Innerhalb von Tags (außer beim mailto a-tag) dürfen E-Mail Adressen nicht umgedreht werden.

    Und eine Kleinigkeit, wenn das nicht zu viel verlangt ist: Wenn die Mailadresse verlinkt ist (mittels mailto) und der Link die class "whitelisted" besitzt, darf die Umwandlung des Links ebenfalls nicht stattfinden:

    <a href="foo@bar.tld" class="whitelisted">dlt.rab@oof</a>


    Dann ist's perfekt, ich zufrieden und ihr alle habt wieder eure Ruhe vor mir und meinen kuriosen Wünschen :D Demnächst plane ich solche Sachen besser, bevor ich jemanden nach Hilfe frage :p

    hackyourlife <3 :biggrin:

    Beitrag zuletzt geändert: 4.2.2013 10:44:49 von fabo
  7. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Na gut, dann eben wieder eine neue Version:
    <?php
    
    header('content-type: text/plain');
    
    $whitelist = array('whitelist@example.com');
    
    $input = <<< ETX
    <a href="mailto:foo@bar.tld">foo@bar.tld</a>
    <a href="mailto:foo@bar.tld">Hallo World foo@bar.tld <img src="bild.ext" /></a>
    <a href="mailto:foo@bar.tld">Email</a>
    <a href="mailto:foo@bar.tld">bar@foo.tld</a>
    <a class="bla" href="mailto:foo@bar.tld" title="xyz">bar@foo.tld</a>
    <a href="http://domain.tld">foo@bar.tld</a>
    es gibt auch nicht verlinkte Mail-Adressen wie mail@example.com, welche irgendwo im Text vorkommen.
    Damit es auch kompliziert wird ist <a href="http://domain.tld?x=foo@bar.tld">das</a> auch erlaubt
    Eine Whitelist gibt es auch, siehe whitelist@example.com
    Mail-Adressen ala <a href="mailto:mail@example.com" class="whitelist">mail@example.com</a> sind auch dabei.
    Steht etwas auf der Whitelist wird es auch nicht ersetzt: <a href="mailto:whitelist@example.com">whitelist@example.com</a>.
    ETX;
    
    
    $link = '<a (.*)href=([\'"])(.+)\\2([^>]*)>(.*)<\/a>';
    $mail = '\\b[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}\\b';
    
    $pattern = "/$link|($mail)/U";
    
    function emailcallback($match) {
    	global $whitelist;
    	if(in_array($match[0], $whitelist))
    		return $match[0];
    	return strrev($match[0]);
    }
    
    function callback($match) {
    	global $mail, $whitelist;
    	$class = 'class="whitelist"';
    	if(!empty($match[6]))
    		return in_array($match[6], $whitelist) ? $match[6] : strrev($match[6]);
    	$whitelisted = (strpos($match[1], $class) !== false) || (strpos($match[4], $class) !== false);
    	if($whitelisted) {
    		$href = $match[3];
    		$content = $match[5];
    	} else {
    		$href = (!in_array(substr($match[3], 7), $whitelist) && (strpos($match[3], 'mailto:') === 0)) ? 'x.php?a=' . urlencode(base64_encode(substr($match[3], 7))) : $match[3];
    		$content = preg_replace_callback("/$mail/U", 'emailcallback', $match[5]);
    	}
    	return "<a {$match[1]}href=\"$href\"{$match[4]}>$content</a>";
    }
    
    $output = preg_replace_callback($pattern, 'callback', $input);
    
    echo(<<< ETX
    INPUT:
    $input
    
    ====
    
    OUTPUT:
    $output
    ETX
    );
    Ausgabe:
    INPUT:
    <a href="mailto:foo@bar.tld">foo@bar.tld</a>
    <a href="mailto:foo@bar.tld">Hallo World foo@bar.tld <img src="bild.ext" /></a>
    <a href="mailto:foo@bar.tld">Email</a>
    <a href="mailto:foo@bar.tld">bar@foo.tld</a>
    <a class="bla" href="mailto:foo@bar.tld" title="xyz">bar@foo.tld</a>
    <a href="http://domain.tld">foo@bar.tld</a>
    es gibt auch nicht verlinkte Mail-Adressen wie mail@example.com, welche irgendwo im Text vorkommen.
    Damit es auch kompliziert wird ist <a href="http://domain.tld?x=foo@bar.tld">das</a> auch erlaubt
    Eine Whitelist gibt es auch, siehe whitelist@example.com
    Mail-Adressen ala <a href="mailto:mail@example.com" class="whitelist">mail@example.com</a> sind auch dabei.
    Steht etwas auf der Whitelist wird es auch nicht ersetzt: <a href="mailto:whitelist@example.com">whitelist@example.com</a>.
    
    ====
    
    OUTPUT:
    <a href="x.php?a=Zm9vQGJhci50bGQ%3D">dlt.rab@oof</a>
    <a href="x.php?a=Zm9vQGJhci50bGQ%3D">Hallo World dlt.rab@oof <img src="bild.ext" /></a>
    <a href="x.php?a=Zm9vQGJhci50bGQ%3D">Email</a>
    <a href="x.php?a=Zm9vQGJhci50bGQ%3D">dlt.oof@rab</a>
    <a class="bla" href="x.php?a=Zm9vQGJhci50bGQ%3D" title="xyz">dlt.oof@rab</a>
    <a href="http://domain.tld">dlt.rab@oof</a>
    es gibt auch nicht verlinkte Mail-Adressen wie moc.elpmaxe@liam, welche irgendwo im Text vorkommen.
    Damit es auch kompliziert wird ist <a href="http://domain.tld?x=foo@bar.tld">das</a> auch erlaubt
    Eine Whitelist gibt es auch, siehe whitelist@example.com
    Mail-Adressen ala <a href="mailto:mail@example.com" class="whitelist">mail@example.com</a> sind auch dabei.
    Steht etwas auf der Whitelist wird es auch nicht ersetzt: <a href="mailto:whitelist@example.com">whitelist@example.com</a>.
  8. Autor dieses Themas

    fabo

    fabo hat kostenlosen Webspace.

    Weißt du eigentlich, wie toll ich dich finde? :love:

    Vielen Dank für deine Geduld :biggrin: Ich gelobe Besserung und lerne den Mist :sound:
  9. @fabo: kommen die spezialfälle wirklich so vor? ok.
    aber mehr sorge hätte ich, dass ein bot base64 bzw. strrev decodieren kann.
    kauf schon mal getränke, falls hackyourlife dir auch dafür die lösung programmiert :-D
  10. Autor dieses Themas

    fabo

    fabo hat kostenlosen Webspace.

    Nene, das mit der "Verschlüsselung" ist kein Problem. Ist alles kein Problem. Ich tu mir lediglich noch sehr schwer mit regulären Ausdrücken. Den Quark habe ich bei meiner PHP-Zertifizierung nicht gebraucht. Oder besser gesagt... Gebraucht schon, aber nur das "Basiswissen".

    EDIT:

    Auch auf die Gefahr hin, dass ich bald wahrscheinlich erschlagen werde... Ich habe vorhin wieder etwas gefunden, was so nicht sein sollte:

    1. Es darf keinerlei Umwandlung innerhalb des <title>-Tags stattfinden
    2. Es darf keinerlei Umwandlung innerhalb von Formularfeldern geben
    3. Es darf keinerlei Umwandlung innerhalb von <script und <style geben

    Wahrscheinlich ist ein solcher "Filter" einfach einzubauen, aber auch das will mir nicht gelingen:

    <title>(?:.*)?' . $mail . '(?:.*)?<\/title>


    Zudem ist mir aufgefallen, dass in der Funktion callback auch $match[6] abgefragt wird. Der Regex enthält aber nur 5 matches. Oder habe ich da etwas übersehen?

    Bevor ich aber ausgeschimpft werde, weil ich nicht zu wissen scheine, was ich will...

    - Alle E-Mail Adressen innerhalb eines Strings umkehren, wenn sie
    -- im Content eines Hyperlinks stehen (<a....>foo@bar.tld</a>)
    -- NICHT innerhalb eines Tags stehen (<input... foo@bar.tld ...>)
    -- nicht auf der Whitelist stehen
    -- nicht mit der Klasse whitelist gekennzeichnet sind

    - Alle E-Mail Adressen innerhalb eines Hyperlinks "verschlüsseln", wenn sie
    -- mittels mailto verlinkt sind

    Alles Andere muss unberührt bleiben, da es sonst zu sehr blöden Fehlern bei der Darstellung kommen kann. So weit sind wir ja im Prinzip auch schon, aber halt noch mit sehr kleinen Macken.

    Beitrag zuletzt geändert: 6.2.2013 9:18:41 von fabo
  11. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!