Moin!
Ich muss irgendwie einen Zeichenbereich ähnlich wie [a-zA-Z0-9_] für sämtliche in UTF8 gültigen Buchstaben bzw. Nicht-Satzzeichen definieren. [...] nicht funktioniert: \u00A1-\uFFFF
Du hast dir da eine ziemlich aufwendige Aufgabe vorgenommen.
Falsch ist natürlich, pauschal den gesamten Zeichenbereich von U+00A1 bis U+FFFF zu verwenden - damit erlaubst du viele Bereiche, die undefiniert sind (beispielsweise dürfen die Codepoints U+D800 bis U+DFFF nicht auftreten, weil sie in UTF-16 als Codierung für Zeichen außerhalb der Basic Multilingual Plane BMP (U+0000 bis U+FFFF) verwendet werden.
Außerdem stecken auch innerhalb der BMP verteilt viele "nette" Zeichen, die zwar hübsch anzuschauen sind, aber keinerlei "Buchstabe" darstellen, sondern in irgendeiner Art und Weise als Sonderzeichen zu betrachten wären. Diese Zeichen mittels RegEx herauszufiltern dürfte eine höchst aufwendige Arbeit werden.
Wie kann ich da vorgehen? Oder bin ich da tatsächlich an eine Grenze der PHP4 Implementierung gestoßen?
Du bist sowieso an eine Grenze gestoßen. Schon allein wegen PHP 4. PHP 4 ist offiziell seit dem 8.8.2008 tot - die Beerdigung wurde mit der definitiv letzten Veröffentlichung diverser Patches gefeiert, ab jetzt gibt es nur noch PHP 5. Stelle alle deine Skripte schnellstmöglich auf PHP 5 um, bevor dich dein Provider dazu zwingt. Wenn dein Provider dir heute kein PHP5-Hosting anbieten kann, wechsle den Provider - er ist schlecht informiert und wird Sicherheitslücken in PHP 4 nicht schließen können.
Zweitens: Ja, PHP bietet derzeit nur eine sehr schlechte Berücksichtigung von Unicode allgemein (UTF-8 ist ja nur eine Codierungsform). Unicode selbst definiert zu jedem Zeichen weit mehr als nur den Codepoint, man kann der Zeichendatentabelle auch entnehmen, welchen Typs das Zeichen entspricht - also beispielsweise "Buchstabe" oder "Satzzeichen". Diese Info würde mutmaßlich auch einem unicodefähigen Regex-Interpreter zur Verfügung stehen, um "\w" auswerten zu können.
Damit PHP mit Multibyte-Encodings umgehen kann, ist die Multibyte-Erweiterung notwendig. Damit kannst du dann UTF-8 in Strings direkt nutzen, beispielsweise mb_strlen() statt strlen() - und auch mb_ereg() existiert.
Auf der anderen Seite frage ich mich allerdings, ob dein Vorhaben grundsätzlich sinnvoll ist. Wenn du sowieso mehrere zehntausend Schriftzeichen erlauben willst, warum willst du dann einige tausend Nicht-Schriftzeichen ausschließen? Wem ist damit geholfen? Welchen Sinn hat das?
- Sven Rautenberg
"Love your nation - respect the others."