Alle Mailadressen ersetzen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
adresse
code
email
ersetzen
header
input
match
muster
output
problem
server
stehen
stelle
string
tag
text
type
umwandlung
url
vorkommen
-
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 :( -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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. -
Wie soll das jetzt genau ablaufen? Alle Mail-Adressen umdrehen und bei Mailto-Links in den base64-Link umwandeln? Das ginge sehr einfach:
Output:<?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 );
Dabei werden Mail-Adressen aber überall umgedreht, also auch außerhalb von Links.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>
-
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
Beitrag zuletzt geändert: 4.2.2013 10:44:49 von fabo -
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>.
-
Weißt du eigentlich, wie toll ich dich finde?
Vielen Dank für deine Geduld Ich gelobe Besserung und lerne den Mist -
@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 -
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage