Alle Mailadressen ersetzen die 2.
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
adresse
code
email
ersetzen
http
input
match
obigen fehler
output
problem
schaffen
stattfinden
text
umwandlung
url
vorkommen
-
Nabend,
vor einiger Zeit hatte ich mal ein Thema Alle Mailadressen ersetzen erstellt. Leider hänge ich noch immer an diesen Problemen:
1. Es darf keinerlei Umwandlung innerhalb des <title>-Tags stattfinden
2. Es darf keinerlei Umwandlung innerhalb von Inputfeldern (also auch hidden) geben
3. Es darf keinerlei Umwandlung innerhalb von <script und <style geben
Ich hatte derweil etliche Sachen ausprobiert, die allesamt nicht funktionieren wollten. Da ich nun langsam etwas wahnsinnig werde, frage ich einfach noch einmal hier (da ich ja auf das vorherige Thema nicht mehr antworten kann).
Die letzte Lösung (danke nochmal an hackyourlife) ist:
<?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 );
Das funktioniert auch wunderbar. Lediglich die obigen "Fehler" machen mir etwas zu schaffen und ich finde einfach keine Lösung. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage