Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
eregi() nur bestimme zeichen ? [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
eregi() nur bestimme zeichen ?


 
borsti
06-03-2004, 16:59 
 
hallo,
folgende situation:

ein user gibt einen namen ein. ein script erstellt daraus ein verzeichnis mit diesem namen auf einem webserver.

nun benutze ich eine funktion, um gewissen zeichen umzuwandeln, so dass der ordner namen korrekt ist:

//URL-gerechte Umformung
function verzeichnisumformen($verzeichnis)
{
$array_1 = array("ä","Ä","ü","Ü","ö","Ö","ß"," ","&");
$array_2 = array("ae","Ae","ue","Ue","oe","Oe","ss","_","und");
for($x=0;$x<9;$x++)
{
$verzeichnis = str_replace($array_1[$x],$array_2[$x],$verzeichnis);
}
return ($verzeichnis);
}

und nun wollte ich noch mit eregi eine bedinung aufstellen,
die alarm schlägt, wenn irgendwas außer a-z oder 0-9 oder eines der zeichen die die funktion umwandelt eingegeben wird.

nur krieg ich das net hin :dontknow:


$muster = ?
if(eregi($muster, $name))

sowas in der art :)

 
toshi
06-03-2004, 17:32 
 
mit preg_match

if(preg_match('/[A-Za-z0-9]/si', $name));
echo 'alles i.O.';


die Funktion würde ich übrigens so aufbauen:


function verzeichnisumformen($verzeichnis)
{
$array = array(
"ä"=>"ae",
"Ä"=>"Ae",
"ü"=>"ue",
"Ü"=>"Ue",
"ö"=>"oe",
"Ö"=>"Oe",
"ß"=>"ss",
" "=>"_",
"&"=>"und"
);
foreach($array as $key => $value)
$verzeichnis = str_replace($array[$key],$array[$value],$verzeichnis);
return ($verzeichnis);
}

 
borsti
06-03-2004, 17:47 
 
hi,
erstmal danke, aber leider funktioniert das nicht so wie es soll.
wenn ich für $name ein sonderzeichen wie * einsetze, wird die if-bedinung trotzdem noch ausgeführt !

:dontknow:

 
toshi
06-03-2004, 18:29 
 
hi,
wenn ich folgendes mache
$name="*";

if(preg_match('/[A-Za-z0-9]/si', $name))
echo 'alles i.O.';
else
echo 'FEHLER!?!';

wird als Ergebnis : FEHLER!?! ausgegeben

aber um das Problem zu umgehen, würde ich bei der User-Eingabe schon überprüfen ob ein zulässiges Zeichen eingegeben wurde


if(preg_match('/[A-Za-z0-9]/si', $name))
{
//weiter mit Verarbeitung
}
else
{
$sMessage = 'ungültiges Zeichen eingegeben ...';
//nochmal das Eingabefeld mit der Fehlermeldung
}

 
borsti
07-03-2004, 23:54 
 
mh ich habe nun eine etwas elegantere lösung in einem anderen forum gefunden:

//Verzeichnisüberprüfung & Erstellung
function create_dir($pfad)
{
if (@mkdir($pfad, 0777))
{
$wert="1";
chmod($pfad, 0777);
}

else
{
$wert="0";
}
return($wert);

}

aber nun folgendes problem: bei der if-überprüfung wir das mkdir() ausgeführt. kann man das irgendwie unterbinden ? also das nur geschaut wird, ob es möglich ist einen ordner zu erstellen, aber dies nicht gleich auchnoch zu tun ?

 
socket_shock
08-03-2004, 00:30 
 
Original geschrieben von toshi


die Funktion würde ich übrigens so aufbauen:


function verzeichnisumformen($verzeichnis)
{
$array = array(
"ä"=>"ae",
"Ä"=>"Ae",
"ü"=>"ue",
"Ü"=>"Ue",
"ö"=>"oe",
"Ö"=>"Oe",
"ß"=>"ss",
" "=>"_",
"&"=>"und"
);
foreach($array as $key => $value)
$verzeichnis = str_replace($array[$key],$array[$value],$verzeichnis);
return ($verzeichnis);
}

Warum so umständlich ?



function verzeichnisumformen($verzeichnis)
{
$array_1 = array("ä","Ä","ü","Ü","ö","Ö","ß"," ","&");
$array_2 = array("ae","Ae","ue","Ue","oe","Oe","ss","_","und");
$verzeichnis = str_replace($array_1,$array_2,$verzeichnis);
return ($verzeichnis);
}


Syntax:

mixed str_replace ( mixed search, mixed replace, mixed subject)

 
borsti
08-03-2004, 00:46 
 
doh... die funktion funktioniert doch eh.. egal ob sie etz noch eleganter wird oder nicht. nur die sache mit der if bedingung macht probleme :dontknow:

 
Lucideye
08-03-2004, 11:44 
 
Hallo

if(preg_match('/[A-Za-z0-9]/si', $name))

Obiges kann hier nicht funktionieren. Diese Regel matcht jede beliebig lange Zeichenkette, einschließlich von Zeilenumbrüchen, die einen BUchstaben oder eine Ziffer enthält.

Du möchtest wahrscheinlich eher etwas à la:


if (!preg_match('~^[a-zA-Z0-9]+$~', $name)) {
exit('$name enthält unerlaubte Zeichen');
}

 
borsti
08-03-2004, 20:24 
 
mh jo so funktioniert das wohl auch, aber ich habe mich jetzt für die andere methode entschieden, ala :

//Verzeichnisüberprüfung & Erstellung
function create_dir($pfad)
{
if (@mkdir($pfad, 0777))
{
$wert="1";
}

else
{
$wert="0";
}
return($wert);

}

nur würde ich es gerne vermeiden, dass die if-bedingung, also das erstellen der datei verhindert wird. also nur geschaut wird, ob das erstellen möglich ist. jedoch wird wenn dem so ist auch gleich eines erstellt. das muss man doch verhindern können ? :confused:

 
Lucideye
08-03-2004, 20:54 
 
Original geschrieben von borsti
mh jo so funktioniert das wohl auch, aber ich habe mich jetzt für die andere methode entschieden, ala :

//Verzeichnisüberprüfung & Erstellung
function create_dir($pfad)
{
if (@mkdir($pfad, 0777))
{
$wert="1";
}

else
{
$wert="0";
}
return($wert);

}

nur würde ich es gerne vermeiden, dass die if-bedingung, also das erstellen der datei verhindert wird. also nur geschaut wird, ob das erstellen möglich ist. jedoch wird wenn dem so ist auch gleich eines erstellt. das muss man doch verhindern können ? :confused:

Deine Funktion ist etwas sehr umständlich.
Man könnte das einfach so schreiben.
function createDir($pfad)
{
return @mkdir($pfad, 0777);
}
Käme dasselbe bei raus. bzw. true oder false anstelle 0 oder 1.

Die Frage ist nur: Was willst Du jetzt überhaupt?
mkdir erstellt ein Verzeichnis, das sollte doch klar sein, oder?

Jetzt willst Du schauen, ob ein Verzeichnis erstellt werden kann und dieses danach erstellen, oder wie?
Verstehe ich ehrlich gesagt nicht. Wenn das Verzeichnis nicht erstellt werden kann, brichst Du einfach ab, wirfst die Fehlermeldung und fertig.

 
borsti
08-03-2004, 21:06 
 
also das sieht dann in der menüstruktur etwa so aus :

erstellen -- ändern -- löschen von ordnern

wenn ich auf erstellen klickte, wird ein ordner erstellt. dafür kann man die von dir beschrieben funktion nutzen.

wenn ich aber auf ändern klicke, soll zunächst überprüft werden, ob der neu gewählte name als ordnername verwendet werden kann.
(dafür war die funktion gedacht
wenn das der fall ist wollte ich mit rename den namen des ordners ändern.

wenn ich aber diese funktion etz zum ändern nutzen würde, würde ja gleich ein neuer ordner erstellt werden und net der bestehende umbenannt werden :rolleyes:

blickt da noch wer durch ?

:D

 
Lucideye
08-03-2004, 21:18 
 
Original geschrieben von borsti

[...]
blickt da noch wer durch ?

:D

Sicher :)
Aber, Du machst es Dir wirklich zu umständlich.
Du schreibst Du willst rename benutzen, warum tust Du es dann nicht?

if (!@rename($old, $new)) {
exit('Ordner konnte nicht umbenannt werden');
}

Aber was steht einer Überprüfung mit dem regulären Ausdruck entgegen?

 
borsti
08-03-2004, 23:22 
 
mh jo bin noch mehr oder weniger ein newbie :D

aber mit dieser mkdir() anweisung klappts bei mir leider auch nicht.
weil die erlaubt im namen zeichen wie !"§$%, die bewirken aber, dass die ordner in der url net funktionieren.

denke die idee mit dem regulären ausdruck is doch die beste.
aber da blicke ich leider noch net ganz durch.

wie genau sollte der etz aussehen, dass nur a-zA-Z0-9 und der _ verwendet werden dürfen ?

if (!preg_match('~^[a-zA-Z0-9]+$~', $name)) {
exit('$name enthält unerlaubte Zeichen');
}


hiermit funktioniert das irgendwie immer noch net :confused:
das sagt bei so ziemlich allem, dass es unerlaubte zeichen enthält

ein beispiel für ne url wäre "galerie/images/test1"

 
socket_shock
09-03-2004, 05:05 
 
if (!preg_match("/^([a-z0-9_]*)$/si", $name))
{
die($name.' enthält unerlaubte Zeichen');
}

// oder

if (!preg_match("/^([a-z0-9_]+)$/si", $name))
{
die($name.' enthält unerlaubte Zeichen');
}

//bin nicht ganz sicher aber so sollte das doch funzen ?!?

 
Lucideye
09-03-2004, 11:25 
 
Original geschrieben von borsti
mh jo bin noch mehr oder weniger ein newbie :D

aber mit dieser mkdir() anweisung klappts bei mir leider auch nicht.
weil die erlaubt im namen zeichen wie !"§$%, die bewirken aber, dass die ordner in der url net funktionieren.

denke die idee mit dem regulären ausdruck is doch die beste.
aber da blicke ich leider noch net ganz durch.

wie genau sollte der etz aussehen, dass nur a-zA-Z0-9 und der _ verwendet werden dürfen ?

if (!preg_match('~^[a-zA-Z0-9]+$~', $name)) {
exit('$name enthält unerlaubte Zeichen');
}


hiermit funktioniert das irgendwie immer noch net :confused:
das sagt bei so ziemlich allem, dass es unerlaubte zeichen enthält

ein beispiel für ne url wäre "galerie/images/test1"

Ist ja auch kein Wunder.
"galerie/images/test1" enthält ja auch Slashes, welche im regulären Ausdruck nicht angegeben/erlaubt sind.
Aber der Name des Ordners hat ja nichts mit dem Pfad zu tun.
Deswegen spielt der Pfad keine Rolle, sondern nur der Name des Ordners, nämlich in diesem Fall "test1" und nur dieser String sollte mit dem regulären Ausdruck getestet werden, nicht der gesamte Pfad.

 
Lucideye
09-03-2004, 11:32 
 
Original geschrieben von socket_shock

if (!preg_match("/^([a-z0-9_]*)$/si", $name))
{
die($name.' enthält unerlaubte Zeichen');
}

// oder

if (!preg_match("/^([a-z0-9_]+)$/si", $name))
{
die($name.' enthält unerlaubte Zeichen');
}

//bin nicht ganz sicher aber so sollte das doch funzen ?!?


Klammern sind nicht nötig und Modfier "s" auch nicht. "*" Ist auch falsch, da somit auch ein leerer String durchgehen würde.

'~^[a-z0-9_\-]+$~i'

ist okay.

 
borsti
09-03-2004, 18:05 
 
ouuuuuman.. das mit dem ganzen pfad hab ich total übersehen, grml
etz funzt es

danke Lucideye für die geduld :huep: :rocks:

:)


Alle Zeitangaben in WEZ +2. Es ist jetzt 04:29 Uhr.