regular Expression
romy
- php
Hi,
ich habe mich daran versucht eine Überprüfungsfunktion zu schreiben, welche nur Ziffern, Buchstaben, Punkt und Unterstrich zulässt, leider ist es nicht geglückt. Wenn ich Semikolons oder Leerzeichen im String habe wird er trotzdem zurückgegeben und nicht leer gemacht.
Kann mir bitte jemand unter die Arme greifen.
<code>
function checkString($string) {
$pattern = "([a-z]|[A-Z]|[0-9]|._)*";
if(!eregi($pattern, $string)) $string="";
return $string;
}
</code>
ciao
romy--
DIE ROMY AUS L. AN DER P. SAGT DANKE UND AUF WIEDERSEHEN
->Alles ist gut wenn es aus Schokolade ist
Hi,
$pattern = "([a-z]|[A-Z]|[0-9]|._)*";
Du prüfst hier auf _beliebig viele_ Vorkommen (auch keines) von eine Klein-, einem Großbuchstaben, einer Ziffer oder der Zeichenfolge "._". Beschäftige Dich damit,
Cheatah
Hi,
$pattern = "([a-z]|[A-Z]|[0-9]|._)*";
"._". Beschäftige Dich damit,
hier hatte ich was vergessen
.|_
- was eine Zeichenklasse ist (also die eckigen Klammern),
ist eine Auswahl von Zeichen, habe auch den negationsoperator gefunden
- wie man Zeilenende und -anfang findet, und
brauche ich dass? Es ist jedenfalls ^ für Anfang $ für Ende
- was der Unterschied zwischen "*" und "+" ist.
okay hab ich jetzt auch, * mehr oder kein Zeichen
jetzt sieht es so aus:
([a-z]|[A-Z]|[0-9]|.|_)+
aber es klappt immer noch nicht!
ciao
romy
Hi,
- was eine Zeichenklasse ist (also die eckigen Klammern),
ist eine Auswahl von Zeichen, habe auch den negationsoperator gefunden
ja, und sie verhindert, dass Du einzelne Zeichen durch viele "|" trennen musst. Teilweise setzt Du schon Zeichenklassen ein, aber das kannst Du noch viel schöner machen.
Übrigens ist \w eine Zeichenklasse, die Groß-, Kleinbuchstaben, Ziffern und den Unterstrich enthält. Das aber nur nebenbei.
- wie man Zeilenende und -anfang findet, und
brauche ich dass?
Egg logical. Du willst ja schließlich den String von Anfang bis Ende betrachten, nicht einfach nur irgendwo mittendrin.
jetzt sieht es so aus:
([a-z]|[A-Z]|[0-9]|.|_)+
aber es klappt immer noch nicht!
Stimmt :-) Mich würde jetzt noch interessieren, _welche_ Fehlermeldung Du erhälst.
Cheatah
Hi,
Stimmt :-) Mich würde jetzt noch interessieren, _welche_ Fehlermeldung Du erhälst.
keinen Fehler, er lässt nur strings zu, die er nicht soll:
probiere es jetzt so, aber es will nicht:
"^([\w])+$"
da sagt er no ending delimiter "^" found, warum?
sorry, wenn es so lange dauert, aber ich wüsste nicht wie ich es sonst rauskriegen sollte!
ciao
romy
Huhu romy
$pattern = "[1]+(.[_a-zA-Z0-9])*$";
immer kommt no ending delimiter ^ found! Warum?
ich vermute mal, das Du inzwischen von ereg auf preg_match umgestiegen bist.
Dann musst Du Deinen regulären Ausdruck in Delimiter einschliessen.
<quote>
The syntax for patterns used in these functions closely resembles Perl. The expression should be enclosed in the delimiters, a forward slash (/), for example. Any character can be used for delimiter as long as it's not alphanumeric or backslash (). If the delimiter character has to be used in the expression itself, it needs to be escaped by backslash. Since PHP 4.0.4, you can also use Perl-style (), {}, [], and <> matching delimiters.
</quote>
http://www.php.net/manual/en/ref.pcre.php
Üblicherweise wird / als Delimiter benutzt, es können aber auch andere Zeichen verwendet werden (s.o.).
Ändere also mal Dein Pattern in
$pattern = "/[2]+(.[_a-zA-Z0-9])*$/";
Viele Grüße
lulu
Hallo romy,
Kann mir bitte jemand unter die Arme greifen.
Prüfe, ob der String _ausschließlich_ aus diesen Zeichen besteht und sie nich nur entählt. (Stichworte: ^ und $) Ach ja, preg_match ist sinnvoller als eregi.
Christian
Hi,
Prüfe, ob der String _ausschließlich_ aus diesen Zeichen besteht und sie nich nur entählt. (Stichworte: ^ und $)
Ich weiss dass dies die Zeichen sind, die Anfang und Ende einleiten. Aber wo sollen sie genau hin
^([a-z]|[A-Z]|[0-9]|.|_)+$ //Fehlermeldung
^([a-z]|[A-Z]|[0-9]|.|_)$+ //Fehlermeldung
Ehrlich gesagt finde ich kein Beispiel, wo das + noch hintendran ist.
Kannst Du mir bitte noch einen Schubs geben.
@ Chetah, okay ich brauche sie ;)
ciao
romy
Hallo romy,
^([a-z]|[A-Z]|[0-9]|.|_)+$ //Fehlermeldung
Bei mir funktioniert dieser Ausdruck, sowohl mit eregi als auch mit preg_match.
Christian
Hi,
^([a-z]|[A-Z]|[0-9]|.|_)+$ //Fehlermeldung
Bei mir funktioniert dieser Ausdruck, sowohl mit eregi als auch mit preg_match.
Es kommt bei mir der Fehler No ending delimiter '^' found ???
ciao
romy
Hallo romy,
Es kommt bei mir der Fehler No ending delimiter '^' found ???
Posix Extended: eregi ("REGEX", ...);
Perl compatible: preg_match ('/REGEX/i', ...);
Lies mal das Handbuch zu preg_match.
Christian
Hi,
danke ihr 3
function checkString($string) {
$pattern = "/[1]+([._a-zA-Z0-9])*$/";
if(!preg_match($pattern, $string)) $string="";
return $string;
}
brachte das gewünschte Ergebnis:
ciao
romy
_a-zA-Z0-9 ↩︎
Hi,
function checkString($string) {
$pattern = "/[1]+([._-a-zA-Z0-9])*$/";
if(!preg_match($pattern, $string)) $string="";
return $string;
}
ich habe gelesen, das wenn der Audruck so geschrieben ist, darf der Punkt nicht am Anfang stehen, aber ansonsten überall, aber das stimmt nicht.
www.gmx.de geht nicht laut dieser RE. (ich kann so nie einen Punkt setzen) Erst wenn der Punkt auch im vorderen Ausdruck ist. Das ist aber nicht Sinn der Sache. (Das Gleiche gilt für den Unterstrich, und den Bindestrich.
Was kann ich da tun?
ciao
romy
_a-zA-Z0-9 ↩︎
Hi,
ich habe gelesen, das wenn der Audruck so geschrieben ist, darf der Punkt nicht am Anfang stehen, aber ansonsten überall, aber das stimmt nicht.
www.gmx.de geht nicht laut dieser RE.
stop. Was ist der Zweck der RegExp? Wenn Du Hostnamen erkennen willst, gibt es bereits etablierte Muster, die sich nach den Standards richten. Vielleicht solltest Du also erst mal Dein Ziel nennen, bevor Du Dich durch eine lange Evolution hangelst, die evtl. trotzdem nicht beim richtigen Punkt endet.
Cheatah
Hi,
stop. Was ist der Zweck der RegExp?
der Zweck ist bei sämtlichen Einträgen unteranderem auch URI's zu überprüfen ob nur diese erlaubten Zeichen verwendet wurden. Ich will damit in jeglicher Hinsicht irgendwelchen Sicherheitslöchern ausweichen.
aber trotzdem sollte man w.3 oder romy-166 oder so schreiben können
aber nicht .profiler oder -romy
ciao
romy
Hi,
stop. Was ist der Zweck der RegExp?
der Zweck ist bei sämtlichen Einträgen unteranderem auch URI's zu überprüfen ob nur diese erlaubten Zeichen verwendet wurden. Ich will damit in jeglicher Hinsicht irgendwelchen Sicherheitslöchern ausweichen.
aha, also geht es um URIs. In Deinem Beispiel war nur ein Hostname genannt worden, was ist z.B. mit einem Protokoll oder einem Localpart?
aber trotzdem sollte man w.3 oder romy-166 oder so schreiben können
aber nicht .profiler oder -romy
Ich glaube, ich habe immer noch nicht verstanden, was für einen Zweck Du verfolgst. Weder in den ersten noch den letzten beiden kann ich irgendeinen Zusammenhang mit URIs erkennen. Allerhöchstens könnte es sich um Hostsegmente bzw. Reihen derselben handeln. Willst Du Subdomains anbieten?
Cheatah
Hi,
Ich glaube, ich habe immer noch nicht verstanden, was für einen Zweck Du verfolgst. Weder in den ersten noch den letzten beiden kann ich irgendeinen Zusammenhang mit URIs erkennen. Allerhöchstens könnte es sich um Hostsegmente bzw. Reihen derselben handeln. Willst Du Subdomains anbieten?
nein nein, es ist viel einfacher als Du denkst.
Es geht mehr um das Prinzip. Wenn ich einen privaten Bereich habe, kann ja auch jemand seine Web-Adresse angeben wollen, oder aber andere Angaben machen. jedenfalls gibt es einen haufen Eingabefelder, deren Werte alle mal in die Datenbank sollen. Nun möchte ich sie vorher überprüfen. Um es mir einfach zu machen, habe ich mir gedacht ich lasse einfach nur Punkte, Ziffern, Buchstaben, Bindestrich und Unterstrich zu. Aber Bindestrich und Punkt soll nicht am Anfang stehen.
Jetzt ist das Probelm, das meine RE im Prinzip funktioniert, ABER: wenn ich den Punkt un den Bindestrich aus dem ersten Ausdruck herausnehme, sind sie plötzlich gar nicht mehr erlaubt. Das verstehe ich nicht, da sie ja eigentlich im zweiten Ausdruck erlaubt sind.
danke echt, dass Du soviel Geduld mit mir hast :)
Ich wünsch Dir schon mal im vorraus ein schönes WE!
ciao
romy