Zur Navigation

Reg exp in eine Funktion einbauen

1 Isildur

Und zwar habe ich die folgende Funktion geschrieben
function getins($key, $value, $name, $class = '') {
         $url = "?";
         foreach($_GET as $k=>$v) {
         	if($k==$key) {
                 $url .= $k."=".$value."&";
                 } else {
         	$url .= $k."=".$v."&";
                 }
         }
         $link = "<a class='".$class."' href='".$url."'>".$name."</a>\n";
         return $link;
         }
Nun ist es aber manchmal nötig mehrere Parameter mit einem Link zu übergeben, das hatte ich gedacht wäre wohl am einfachsten mit reg exps möglich indem ich dann getins("var1:var2:","val1:val2","name"); aufrufe und anschließen die Zeichenkette mit Hilfe der Trennzeichen aufteile und in einem Array speicher. Nun sind Reg exps für einen Anfänger eh ein etwas schwieriges Thema und ich weiß nicht, wie ich es hinbekomme, dass automatisch ein Array mit der entsprechenden Anzahl von Einträgen(und den Werten) erstellt wird. Die oben stehende Funktion ist dazu nur ein Anwendungsbeispiel.

15.05.2006 13:58

2 Jörg

Das Splitten und Speichern in Arrays kannst du beispielsweise mit explode() bewerkstelligen. Innerhalb der Funktion könntest du diese dann in einer Schleife wieder auslesen, z.B.:

$url = "?";
$keys = explode(":", $key);
$values = explode(":", $value);
$count = count($keys);
$i = 0;
while ($i < $count) {
    $url .= $keys[$i]."=".$values[$i]."&";
    ++$i;
}

15.05.2006 19:02

3 Isildur

Danke! Hab allerdings noch Probleme bei der Umsetzung. Im Moment sieht das ganze so aus
function getins($key, $value, $name, $class = '') {
         $url = "?";
         $keys = explode(":", $key);
	$values = explode(":", $value);
         $count = count($keys);
	$i = 0;
         while ($i < $count) {
         foreach($_GET as $k=>$v) {
         	if($k==$keys[$i]) {
                 	$url .= $k."=".$values[$i]."&";
                 	} else {
         		$url .= $k."=".$v."&";
                 	}
         $url .= trim($keys[$i])."=".trim($values[$i])."&";
	++$i;
         }
         $link = "<a class='".$class."' href='".$url."'>".$name."</a>\n";
         return $link;
         }
}
Dann erhalte ich die Fehlermeldung "Notice: Undefined offset: 1 in D:\XAMPP\xampp\htdocs\Myrkwid\config.php on line 46"(Z.46=if($k....)
Ich denke mal das foreach in der while Schleife macht Probleme(ist glaube ich logisch auchnicht wirklich sinnvoll) wie kann ich trotzdem diese 3 Sachen unter einen Hut bringen:
1.überprüfen ob die übergebenen keys schon in $_GET vorhanden ist
1.1 falls nicht sie mit ihren setzen
2.falls ein key schon vorhanden ist ihn auf seinen neuen Wert setzen
3.die übrigen keys und values aus $_GET wieder in die URL schreiben

19.05.2006 15:43 | geändert: 19.05.2006 16:12

4 Isildur

So hab mich nochmal dran versucht denke das sieht auchschon deutlich vielversprechender aus aber ein Problem bleibt noch. Er schreibt wenn ich zwei Werte angebe also z.B. so:
echo getins("key1:key2","val1:val2", "test");
nur den ersten (also key1=val1) in die url der zweite verschwindet einfach.
Die Funktion sieht jetzt so aus
function getins($key, $value, $name, $class = '') {
         $url = "?";
         $keys = explode(":", $key);
	$values = explode(":", $value);//splitting the strings
         $count = count($keys);
	$i = 0;
         while ($i < $count) {//as long as there are keys left to check
         	if(!array_key_exists($keys[$i], $_GET)) {//if the key doesnt already exist
         		$url .= trim($keys[$i])."=".trim($values[$i])."&";
         	}else{//else if the key already exists overwrite the value
         	        $array = array_keys($_GET);
         	        $pos = array_search($keys[$i], array_keys($_GET));//position of the existing element
         	       	$url .= $array[$pos] ."=". $values[$i]."&";//overwriting the old value
		++$i;
         	}
         	$link = "<a class='".$class."' href='".$url."'>".$name."</a>\n";
         	return $link;
         }
}

25.05.2006 16:03 | geändert: 25.05.2006 16:04

5 Jörg

Sorry, ich hatte ganz übersehen, dass du den Beitrag vor einer Woche noch editiert hattest.

Bei der jetzigen Funktion scheint mir die Verschachtelung der Klammern nicht richtig, probier es mal so:

function getins($key, $value, $name, $class = '')
{
    $url = "?";
    $keys = explode(":", $key);
$values = explode(":", $value);//splitting the strings
    $count = count($keys);
$i = 0;
    while ($i < $count) {//as long as there are keys left to check
        if(!array_key_exists($keys[$i], $_GET)) {//if the key doesnt already exist
            $url .= trim($keys[$i])."=".trim($values[$i])."&";
        } else {//else if the key already exists overwrite the value
            $array = array_keys($_GET);
            $pos = array_search($keys[$i], array_keys($_GET));//position of the existing element
            $url .= $array[$pos] ."=". $values[$i]."&";//overwriting the old value
        }
        ++$i;
    }
    $link = "<a class='".$class."' href='".$url."'>".$name."</a>\n";
    return $link;
}

25.05.2006 16:37

6 Isildur

Danke! Scheint jetzt zu funktionieren. Das mit den Klammern hatte ich übersehen weil ich halt immer wieder was umgestellt hatte erst ohne if(um zu gucken obs soweit geht) etc.

25.05.2006 16:52

7 Isildur

Naja gut zu früh gefreut. Der Funktion fehlt noch ein wichtiges Element. Alle vorher vorhandenen und nicht geänderten Paramter wieder in die url zu schreiben. Ich will da ja dann nichts doppelt haben dazu hatte ich mir gerade folgendes überlegt, was aber noch nicht funktioniert, da die Sachen doch noch doppelt in der url auftauchen. Ich denke das hängt mit den Bereichen der Variablen zusammen, da ich ja in der while Schleife was ändere, dass das dann draußen nicht gilt oder so?!
Hier der Code
function getins($key, $value, $name, $class = '') {
	$k = array_keys($_GET);
         $v = array_values($_GET);
         $url = "?";
         $keys = explode(":", $key);
	$values = explode(":", $value);//splitting the strings
         $count = count($keys);
	$i = 0;
         while ($i < $count) {//as long as there are keys left to check
         	$array_search_k = $k[array_search($keys[$i], $k)];
                 unset ($array_search_k);
         	if(!array_key_exists($keys[$i], $_GET)) {//if the key doesnt already exist
         		$url .= trim($keys[$i])."=".trim($values[$i])."&";
         	}else{//else if the key already exists overwrite the value
         	        $array = array_keys($_GET);
         	        $pos = array_search($keys[$i], array_keys($_GET));//position of the existing element
         	       	$url .= $array[$pos] ."=". trim($values[$i])."&";//overwriting the old value
                 }
                 ++$i;
         }
         $c = count(array_keys($k));
	$j = 0;
         while ($j < $c) {
         	$url .= $k[$j]."=".$v[$j]."&";
                 ++$j;
         }
         $link = "<a class='".$class."' href='".$url."'>".$name."</a>\n";
         return $link;
}

25.05.2006 18:09

8 Jörg

In der zweiten while-Schleife musst du auch nochmal prüfen, ob die Variable nicht schon in $keys enthalten war:

$c = count(array_keys($k));
$j = 0;
while ($j < $c) {
    if(!in_array($k[$j], $keys)) {
        $url .= $k[$j]."=".$v[$j]."&";
    }
    ++$j;
}

25.05.2006 21:40

9 Isildur

Danke!
Hab das ganze noch zu einer foreach Schleife umgeschrieben, warum selbst was basteln wenn PHP schon was fertiges zur Verfügung stellt?
Schaut jetzt so aus
function getins($key, $value, $name, $class = '') {
         $url = "?";
         $keys = explode(":", $key);
	$values = explode(":", $value);//splitting the strings
         $count = count($keys);
	$i = 0;
         while ($i < $count) {//as long as there are keys left to check
         	if(!array_key_exists($keys[$i], $_GET)) {//if the key doesnt already exist
         		$url .= trim($keys[$i])."=".trim($values[$i])."&";
         	}else{//else if the key already exists overwrite the value
         	        $array = array_keys($_GET);
         	        $pos = array_search($keys[$i], array_keys($_GET));//position of the existing element
         	       	$url .= $array[$pos] ."=". trim($values[$i])."&";//overwriting the old value
                 }
                 ++$i;
         }
         foreach($_GET as $k=>$v) {
                 if(!in_array($k, $keys)) {
       		$url .= $k."=".$v."&";
   		}
         }
         $link = "<a class='".$class."' href='".$url."'>".$name."</a>\n";
         return $link;
}

26.05.2006 12:24

Beitrag schreiben (als Gast)





[BBCode-Hilfe]