Zeilenumbrüche mit eregi zulassen
Simon
- php
Hi,
hab da ein Kleines Problem. Und zwar lässt diese Funktion keine Zeilenumbrüche zu.
Kann mir da jemand vielleicht helfen?
Hier mal das Script:
function verifiziereText ($testString) {
return (eregi("^([[:alnum:]]|-|\.| |\?|,|\!|\"|'|\n|\r)+$", $testString));
}
MfG
Simon
Lieber Simon,
[[:alnum:]]
was ist das? Die öffnende eckige Klammer leitet meines Wissens eine Character Class ein. Damit wäre Dein Muster fehlerhaft, da die erste schließende eckige Klammer die Character Class wieder beendet (und dann nocheinmal).
Die umgebenden runden Klammern kannst Du getrost entsorgen, denn return (foo());
ist exakt dasselbe wie return foo();
.
Im PHP-Manual auf der Seite zu ereg() wird empfohlen, statt den ereg...-Funktionen die preg_...-Funktionen zu benutzen, die meistens sowieso schneller sein sollen. Hat es einen Grund, dass Du nicht die preg_...-Funktionen benutzt? Dort könnte ich dir sofort sagen, wie Du Zeilenumbrüche mit im String berücksichtigen kannst (mit dem s-Modifier). Vielleicht benötigt Dein Suchmuster in den ereg...-Funktionen auch soetwas wie "(?s)" am Anfang? Zumindest hilft das bei den Mustern in den preg_...-Funktionen.
Liebe Grüße,
Felix Riesterer.
Moin!
Lieber Simon,
»» [[:alnum:]]
was ist das? Die öffnende eckige Klammer leitet meines Wissens eine Character Class ein. Damit wäre Dein Muster fehlerhaft, da die erste schließende eckige Klammer die Character Class wieder beendet (und dann nocheinmal).
Das ist eine syntaktisch korrekte Zeichenklassenbezeichung für alphanumerische Zeichen in POSIX-kompatiblen regulären Ausdrücken der ereg*-Funktionen.
In preg*-Funktionen funktioniert das nicht.
Im PHP-Manual auf der Seite zu ereg() wird empfohlen, statt den ereg...-Funktionen die preg_...-Funktionen zu benutzen, die meistens sowieso schneller sein sollen. Hat es einen Grund, dass Du nicht die preg_...-Funktionen benutzt?
Das ist genau der Punkt: ereg-Funktionen soll man zugunsten der preg-Funktionen meiden.
- Sven Rautenberg
echo $begrüßung;
Die umgebenden runden Klammern kannst Du getrost entsorgen, denn return (foo()); ist exakt dasselbe wie return foo();.
Es ist richtig, dass man die äußeren runden Klammern an der Stelle nicht benötigt und weglassen kann. Aber "exakt dasselbe" ist es nicht.
Zunächst: Eine Variable ist ein Bezeichner, der auf einen Container verweist, in dem ein Wert abgelegt ist. Eine Variable beinhaltet also nicht direkt einen Wert sondern ist sozusagen nur einen Verweis auf einen Container.
Eine Funktion kann beispielsweise eine Referenz auf eine Variable zurückgeben.
function &foo() {
return $bar;
}
Durch das & vor dem Funktionsnamen wird, anders als sonst, keine Kopie des Containerinhalts (auf den $bar verweist) zurückgegeben, sondern eine Referenz auf $bar.
$qux =& foo();
$qux verweist nun ebenso wie $bar auf den selben Variablencontainer und Änderungen in $qux sieht man auch in $bar und umgekehrt.
Schreibt man nun
return ($bar);
erzeugt man damit einen Ausdruck, dessen Inhalt aus der Variable $bar genommen wird. Es wird also eine Kope des Variablencontainers erzeugt, mit der die Ausdrucksberechnung stattfindet. Der Ausdruck selbst ist unsprektakulär und außer der Containerkopie passiert nichts weiter. Das Ergebnis ist jedenfalls ein kopierter Wert und keine Referenz.
Das gleiche passiert auch, wenn keine Referenzen im Spiel sind, nur ist es hier für das Ergebnis nicht weiter von Belang, ob das eine Kopie oder eine kopierte Kopie ist. Auch
return (foo());
spielt in der gleichen Liga, hier ist es eben der von der Funktion foo() zurückgegebene Container der noch einmal als Ausdruck ausgewertet wird bevor er dem return übergeben wird.
Interessant ist das Ganze unter PHP5 und bei Objekten, denn Objekte werden ab der Version generell als Referenz übergeben. Solche Fehler sind nicht einfach zu finden, wenn man mit dem Objekt weiterarbeiten will, stattdessen aber von irgendeinem Zwischenschritt ungewollt eine Kopie weitergegeben wird.
Wenn man eine Ausführungen mit den Interna von PHP beim Variablenhandling vergleicht wird man feststellen, dass sie nicht ganz richtig sind. Aber das tut nichts weiter zur Sache, denn nach außen hin verbirgt PHP, dass Variablencontainer nicht immer direkt kopiert werden, wenn eine Zuweisung stattfindet sondern erstmal nur eine Quasi-Referenz erzeugt wird und das eigentliche Kopieren erst bei Änderungen einer der Containerinhalte passiert.
echo "$verabschiedung $name";