Hallo,
ich habe in einem Projekt einen simplen Template-Parser, der unter anderem die gesamte Ausgabe nach E-Mail-Adressen durchsucht und sie zum Schutz gegen Bots per JS "verschlüsselt" bzw. durch Bilder ersetzt. Dafür verwende ich folgenden Code und der funktioniert soweit auch einwandfrei - für das Ersetzen ist die Methode encode_email_adress zuständig:
preg_replace_callback("/([a-zA-Z0-9_\-\.]+@[a-zA-Z0-9_\-\.]+\.[a-zA-Z]{2,6})/i", create_function('$treffer', 'return contentmanagement::encode_email_adress($treffer[0]);'), $text )
Allerdings kann es zu Problemen kommen, sobald eine E-Mail-Adresse von einem Benutzer in ein Formular eingegeben wurde. Wenn das Formular nicht korrekt ausgefüllt wurde werden nach dem Prinzip der Sticky Forms alle korrekten Eingaben wieder in die entsprechenden Felder eingefügt - und in JS-Code bzw. Links auf Bilder ersetzt, was nicht sein soll. Folgender Codeversuche funktionieren leider nicht:
preg_replace_callback("/^(value=\")([a-zA-Z0-9_\-\.]+@[a-zA-Z0-9_\-\.]+\.[a-zA-Z]{2,6})/i", create_function('$treffer', 'return contentmanagement::encode_email_adress($treffer[1]);'), $text )
preg_replace_callback("/(value=\"){0}([a-zA-Z0-9_\-\.]+@[a-zA-Z0-9_\-\.]+\.[a-zA-Z]{2,6})/i", create_function('$treffer', 'return contentmanagement::encode_email_adress($treffer[1]);'), $text )
Kurz: ich suche einen regulären Ausdruck, der 'test@test.de' immer erkennt, außer im Fall 'value="test@test.de"'.
Noch besser wäre auch, wenn er auch '<textarea>[...]test@test.de[...]</textarea>' nicht erkennt, aber das dürfte eigentlich nicht vorkommen und eine solche Erkennung ist vermutlich nicht sehr performant.
Ich würde mich sehr freuen, wenn mir jemand weiterhelfen könnte. Im Prinzip müsste es doch nur daran hängen den Block "(value=")" sauber zu negieren - nur wie?
Grüße
Gabriel