[quiz#1] Kd3 (php)

KD3

Erfahrenes Mitglied
Sorry das es so lange gedauert hat. Da ich krank war und kaum kraft hatte um was zu tippen :D Aber ich glaub meine Lösung ist lächerlich :D^^

PHP:
/*

Kommentierung @_@

Beispiel: 


  	  Zeile 12-24:

	  29: $qry wird escaped.
	  30: Ein "+" im Query wird gelöscht.
	  34-41: Hier wird die Liste einmal durchlaufen und die 
		 Muster werden gesammelt.
		 Wie z.B 
			$arr0 = "Geo", 
			$arr1 = "ton", 
			$arr2 = "George Washington", 
			$arr3 = "GW" # Alle kleinbuchstaben werden entfernt


	  Zeile 26-33:

	  Anstatt einer if-Abfrage hab ich die 
	  "Drei Operator Schreibweise" benutzt 
	  (ich hoffe, dass es so genannt wird :D)
          Hier werden natürlich alle Präsidenten durchlaufen 
	  und bei einer Übereinstimmung 
	  wird der Gefundene ausgegeben.

*/

PHP:
<?php

$gf = file('presidents.txt');

if(isset($_POST['qry'])) {

  $arr0 = array();
  $arr1 = array();
  $arr2 = array();
  $arr3 = array();
  
  $qry = htmlspecialchars($_POST['qry']);
  $qry = preg_replace("~[\x2b]~",'',$qry);

  // Muster sammeln
  
  for($i = 0; $i < count($gf); ++$i) {
    
    $arr0[] = substr($gf[$i],0,3);
    $arr1[] = substr($gf[$i],-5,3); // Unsicher.........................
    $arr2[] = $gf[$i];
    $arr3[] = preg_replace("~[^\x41-\x5a]~",'', $gf[$i]); 
    
  }

  for($i = 0; $i < count($gf); ++$i) {
  
  echo preg_match("~".$arr0[$i]."~", $qry) || preg_match("~".$arr1[$i]."~", $qry) 
    || preg_match("~".$qry."~", $arr2[$i]) || $qry === $arr0[$i] 
    || $qry === $arr1[$i] || $qry == $arr3[$i]
  ?'Match found : '. $arr2[$i].'<br />' : '';
  
  }

}
?>
<html>

<head>
<title>Tutorials.de QUIZ #1 (PHP)</title>
</head>
<body>
<form method="post" action="index.php" accept-charset="utf-8" >
<input name="qry" value="Suchbegriff" OnClick="this.value=''" />
</form>
</body>
</html>
 
Zuletzt bearbeitet:

Dennis Wronka

Soulcollector
Unschoen finde ich hier dass Du eine Funktion getsig() und eine Funktion getsig2() hast. Die Namensgebung ist meiner Meinung nach nicht gerade gut, was leider auch bei Variablennamen wie z.B. $gf und $foo.

Dies ist zwar nur ein kleines Stueckchen Code, dennoch finde ich es wichtig immer darauf zu achten vernuenftige Namen fuer Funktionen und Variablen zu vergeben; in einem grossen Projekt ist dies vor allem dann wichtig wenn man es nach einem halben Jahr mal bearbeiten will, wenn man mit mehreren daran arbeitet, oder wenn mal jemand anders den eigenen Code nachvollziehen soll.
 

KD3

Erfahrenes Mitglied
@OnlyFoo

JFK,GW, Geo usw. gehen und werden erfasst. Wenn du das mit dem Highlighting meinst dann hast du schon recht.

@kuddeldaddeldu

Die Funktionen waren sinnlos. Ich habe das Script jetzt viel verständlicher gemacht. Ich hab auch jetzt einbisschen Kommentiert ;)

@Dennis Wronka

Meine Namensgebungen sind sehr schlimm, ich weiß :D. z.B sollte gf=getfile sein :D^^ Ich hab z.B ein großes CMS gecodet worin nur Variablennamen als - ich will mal sagen "Mnemonic's" - existieren. Ich denke mal wenn ich die veröffentlichen würde, würde jeder nach paar Minuten den Ordner worin sich die Dateien befinden, direkt in den Papierkorb bzw. /dev/null verschieben.
 

kuddeldaddeldu

Erfahrenes Mitglied
Hi,

ich habe das mal ausprobiert und näher angeschaut. Leider muss ich sagen , dass die Lösung ziemlich an der Aufgabe vorbei ist.
Matches, bei denen das Suchwort zwar vorkommt, aber nicht an einem Stück (was ja Kern der unscharfen Suche ist), werden nur in dem ganz speziellen Fall gefunden, in dem das Suchmuster nur aus Grossbuchstaben besteht und im String auch nur diese Grossbuchstaben so vorkommen.
Dafür ist nach Deiner Lösung ein Match, wenn die ersten oder die letzten 3 Zeichen des input-Strings im Suchmuster vorkommen (welcher Gedankengang steckte denn da hinter?). Das führt zu (theoretisch unendlich) vielen falschen Matches. So liefert die Abfrage "George Bush" auch Herrn Washington, die Abfragen "Geobla" und "blaGeo" liefern ebenfalls alle drei Georges.

Ansonsten fällt auf, dass Du grundsätzlich die regexp-Engine bemühst, wo auch die einfachen (performanteren) String-Funktionen gereicht hätten.
Den Einsatz von htmlspecialchars (an der Stelle) verstehe ich gar nicht, zumal Vergleiche eines maskierten Strings mit einem unmaskierten String (aus der Datei) fehlschlagen würden, wenn dort die entsprechenden Sonderzeichen vorkommen. Du wolltest sicherlich die Ausgabe maskieren.

LG