Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   PHP zeichenketten filter mit preg_replace (https://www.delphipraxis.net/120916-php-zeichenketten-filter-mit-preg_replace.html)

Luckie 18. Sep 2008 22:37


PHP zeichenketten filter mit preg_replace
 
Ich habe in meinem php-Mailscript festgestellt, dass bei den Namen auch die Umlaute verloren gehen. Ich denke, das wird hier an dieser Stelle passieren:
Code:
$name = preg_replace('#[^a-zA-Z0-9 ]#i', '', $_POST['yourname'])
Was müsste cih dort ändern, damit die Umlaute und Satzzeichen erhalten bleiben? Ich kenne mich mir Regulärenausdrücken leider nicht aus.

Dax 18. Sep 2008 23:05

Re: PHP zeichenketten filter mit preg_replace
 
Wenn du Umlaute und _alle_ Satzzeichen erhalten willst, geht das ganz schnell in die Unicode-Zeichenklassen. Beispiel: [^\w\p{P}] sollte deinen Ansprüchen genügen, wenn die Engine die \p{}-Syntax unterstützt - ansonsten musst du an Stelle des \p{P} alle Satzzeichen auflisten.


http://www.regular-expressions.info/

Daniel 19. Sep 2008 08:03

Re: PHP zeichenketten filter mit preg_replace
 
Zitat:

Zitat von Luckie
Code:
$name = preg_replace('#[^a-zA-Z0-9 ]#i', '', $_POST['yourname'])

Der Hinweis mit dem Unicode ist richtig, aber vielleicht langt Dir ja eine kleinere Lösung. Oben definierst Du in den eckigen Klammern eine Zeichenmenge: Kleinbuchstaben, Großbuchstaben, Ziffern und dann das Leerzeichen. Mit dem Hütchen (^)davor negierst Du die Menge, so dass Folgendes daraus wird:

"Alles, was nicht Kleinbuchstabe a-z, Großbuchstabe A-Z, eine Ziffer 0-9 oder ein Leerzeichen wird, fliegt raus"

Die Minimalversion einer Erweiterung sähe jetzt so aus, dass Du diese Zeichenmenge um die Umlaute und ggf. das scharfe S erweiterst:

Code:
$name = preg_replace('#[^a-zA-Z0-9[b][u]äöüÄÖÜß[/u][/b] ]#i', '', $_POST['yourname'])
Es gibt noch das Universal-Zeichen \w, das stellvertretend für alle sog. "word-character" steht, also "alle" Buchstaben. Dann muss man allerdings darauf achten, PHP die korrekte Ländereinstellung zu verpassen:

A "word" character is any letter or digit or the underscore character, that is, any character which can be part of a Perl "word". The definition of letters and digits is controlled by PCRE's character tables, and may vary if locale-specific matching is taking place. For example, in the "fr" (French) locale, some character codes greater than 128 are used for accented letters, and these are matched by \w.


Der Ausdruck wäre dann mutmaßlich (ungetestet) wie folgt (oder ähnlich, da ungetestet):
Code:
$name = preg_replace('#[^\w ]#i', '', $_POST['yourname'])


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz