Tach!
aber verhindert mein preg_replace in seiner einfachsten und strengsten Form nicht genau, dass ein Kontektwechsel stattfinden kann?
Kontextwechsel bedeutet hier, dass Daten in einen anderen Kontext gebracht werden. Du fügst Daten in HTML-Code ein, du fügst Daten in Javascript-Code ein, du fügst Daten in ein SQL-Statement ein, du fügst Daten in ein Shell-Komamndo ein. Der Kontextwechsel ist immer da. Deine Aufgabe als verantwortungsvoller Programmierer ist es, die Daten für den jeweiligen Kontextwechsel entsprechend vorzubereiten. Teilweise muss man sogar noch feiner differenzieren. "SQL-Statement" ist zum Beispiel viel zu allgemein, da gibt es Strings, zusätzlich mit LIKE, da gibt es Bezeichner, und da gibt es Zahlen, von denen manche ohne Anführungszeichen notiert werden wollen.
Wenn du alle Zeichen für alle potentiellen Kontexte beachten willst, dann musst du als Muster .* nehmen.
Deine Aufgabe beim Entgegennehmen der Daten beschränkt sich lediglich auf eine fachliche Prüfung. Wenn beispielsweise eine Zahl erwartet wird, sollte is_numeric() entsprechend antworten oder du nimmst einfach intval()/floatval() zum Erzwingen. Es spielt dann auch keine Rolle, ob der Anwender 1E6 oder 1000000 oder 0xF4240 eingegeben hat.
Zudem solltest du beachten, dass deine Prüfmöglichkeiten beschränkt sind. Eine nutzbare Email-Adresse lässt sich ebensowenig erkennen wie eingegebener aber den formalen Anforderungen genügender Müll.
preg_replace('/[^A-ZÄÖÜa-zäöü0-9?\1().[space]{2,} _-+&]/', '', $Wert);
Außerdem ist dein Regex fehlerhaft. [:space:] mit Doppelpunkten würde das heißen, aber ohne Wiederholungsangabe. In einer Zeichenklasse gelten die übrigen Regex-Regeln nicht mehr. Zum Beispiel stehen darin immer einzelne Zeichen (mit Ausnahme einiger Zeichentypen, wie \d, \D etc.). Zwei Leerzeichen hintereinander kannst du nicht in einer Zeichenklasse angeben. Die Zeichen {2,} stehen hier jedes für sich selbst. Zudem ist es nicht erforderlich, Sonderzeichen (mit Ausnahmen für , - und ^) zu maskieren.
dedlfix.