Suchabfrage

zmedia

Angesehenes Mitglied
Ich bin an einem Suchformular für die eingene Seite. Im Ergebnis wird das gesuchte Wort zu markiert.

Das mach ich mit
CODE
$artikel_besch = trim(str_replace("$search","<span style='background-color:#ffff00;'>$search</span>",$artikel_besch));


Nun habe ich das Problem der Gross-Kleinschreibweise. Hier sollten alle begriffe markiert werden. z.Bsp. test muss "test" und "Test" markieren.

Leider habe ich zur Zeit eine Blockade, ich könnte zwar alles in Kleinbuchstaben umwandeln, aber die Ansicht des Ergenis muss wieder original (also mit jeweiligem Grossbuchstaben) dargestelt werden.

Kann mir hier jemand weiterhelfen und meine Gedankensblockade lösen?

Thx René
 
Hallo,

QUOTE (z-web @ Sa 19.11.2005, 23:35)[...]
Nun habe ich das Problem der Gross-Kleinschreibweise. Hier sollten alle begriffe markiert werden. z.Bsp. test muss "test" und "Test" markieren.

[...]

Kann mir hier jemand weiterhelfen und meine Gedankensblockade lösen?
[...]

das Thema hatten wir bereits vor kurzen, nur wird es hier leider nicht in den entsprechenden Bereich verschoben...

Funktion zum Suchbegriffe hervorheben



MfG Sascha Ahlers
 
Hi

Ja, Plattern! das ist nicht wirklich meine Stärke, zumal ich nirgends richtige Referenzen über die Zeichensetzung finde.

CODE $artikel_besch = preg_replace('/([^öäüß\w\d])(' . $search . ')([^öäüß\w\d])/i', '\1<span style="background-color: #ffff00;"><b>\2</b></span>\3', $artikel_besch);


Das funktioniert mehr oder weniger wie ich mir das vorstelle, nur wie kann ich das Plattern beeinflussen, ergänzen oder ändern, dass weiss ich nicht?
CODE ([^öäüß\w\d])



Gruss René
 
CODE
function serach_mark($text,$such) {
$serar = explode(' ', $such);
$text = strip_tags($text);
$text = stripslashes($text);
$rte = '';
$tleng = 30;
foreach($serar as $v) {
$firs = strpos(strtolower($text),strtolower($v));
$begi = (($firs - $tleng) < 0 ? 0 : $firs - $tleng );
$leng = strlen($text);
$ende = (($firs + strlen($v) + $tleng) > $leng ? $leng : $firs + strlen($v) + $tleng );
$ttxt = substr($text,$begi,($ende - $begi));
$rte .= ' ... '.preg_replace("/".$v."/si",'<b>'.$v.'</b>',$ttxt);
}
return ($rte);
}



das ist ne kleine php funktion die ich mir mal geschrieben habe. du übergibst einfach den text in dem die wörter makiert werden soll und den suchstring.

naja der suchstring wird mit explode gesplittet usw. aber ist noch nicht so wirklich ausgereift denke ich +g+...

das i ist gut damit du eben nicht zwischen klein und groß unterscheiden musst und das s is für zeilenumbruch mitbeachten ...
 
QUOTE (z-web @ So 20.11.2005, 14:43)Das funktioniert mehr oder weniger wie ich mir das vorstelle, nur wie kann ich das Plattern beeinflussen, ergänzen oder ändern, dass weiss ich nicht?
CODE ([^öäüß\w\d])




Schau mal in der PHP-Dokumentation nach:

Suchmuster-Modifikatoren
Pattern Syntax
Es ist wohl in Englisch, aber dafür wird es komplett beschrieben.
  • ^ → ist in den eckigen Klammeren eine Verneinung: "Nehme nicht die Zeichen..."
  • \w → steht für ein Zeichen aus einem Wort (ich denke es handelt sich hierbei um die Zeichen A-Za-z, weshalb ich öäüß hinzugefügt habe → sicherheitshalber)
  • \d → steht für eine Zahl von 0 bis 9.
  • Die eckigen Klammern stehen für ein einzelnes Zeichen und dessen möglichen Zeichen (bzw. dessen nicht möglichen Zeichen, bei einer Negierung)
  • Die Rundenklammern zeigen an, dass dies ein Subplattern (also Unter-Pattern) darstellt, und dient auch gleichzeitig als eine Art Stringauswahl bzw. Platzhalter (mir fällt im Moment nicht der eigentliche Ausdruck ein; aber diese beiden Wörter beschreiben die Funktion einigermasen), welchen ich im zweiten Argument nach der Reihenfolge entweder mit \1, \2 usw. oder auch $1, $2 usw. aufrufen kann, um diesen String genau dort einzufügen.


MfG Sascha Ahlers
 
Danke für die Links.

Was mir dennoch Kopfzerbrechen macht ist die Tatsache, dass selbst Du mir "nur" sagen kannst;"ich denke es handelt.."

Wovon hängt es denn ab? Kann man das ganze nicht mit regulären Ausdücken (wortspielerei) audrücken?

Mein Problem ist nun noch, dass anscheinend die Leerzeichen nicht mit einfliessen. Sprich wenn ich nach einer Pharse suche "mein test" so wird nichts markiert.

Lese mich einmal durch die Ref, vielleicht lichtet sich das Dickicht.
 
QUOTE (z-web @ So 20.11.2005, 16:08) [...] Was mir dennoch Kopfzerbrechen macht ist die Tatsache, dass selbst Du mir "nur" sagen kannst;"ich denke es handelt.." [...]

Doch, die fließen mit ein, dies hängt davon ab, welcher Wert sich in $search befindet.

Bei \w ist das einzigste, wo ich mir nicht ganz sicher bin, da ich nicht weiß, was in der PHP-Dokumentation ein Wort-Charakter sein soll, i. d. R. müsste es aber die Zeichen von A-Z in Groß- und Kleinschreibung ohne die Sonderzeichen sein.
Wären es mehr, würde die Verwendung wesendlich bessere Einsatzmöglichkeiten bieten. Ich werde es wohl mal in der nächsten Woche kurz testen, es ist ja nicht schwer, dies eben zu machen.



MfG Sascha Ahlers
 
Ja, Du hast recht die leerzeichen, wenn sie richtig im $search eingetragen sind, werden auch mitgenommen.

Nur suche ich nach *search* (sprich %$search%), also sollten auch Worte markiert werden welche nur einen Teil des Search beiinhalten. Was leider nicht der Fall ist, es wird nur nach kompletten Worten gesucht und ersetzt!
 
QUOTE (z-web @ So 20.11.2005, 18:57) [...]
Nur suche ich nach *search* (sprich %$search%), also sollten auch Worte markiert werden welche nur einen Teil des Search beiinhalten. Was leider nicht der Fall ist, es wird nur nach kompletten Worten gesucht und ersetzt!

Dazu musst du einfach nur die beiden äußeren Subpattern entfernen:


CODE $artikel_besch = preg_replace('/(' . preg_quote( $search, '/') . ')/i', '<span style="background-color: #ffff00;"><b>\1</b></span>', $artikel_besch);




MfG Sascha Ahlers

PS: Die Funktion preg_quote() [1] sollte dabei besser verwendet werden, so werden eventuelle Pattern des Such-Strings escaped.


[1] string preg_quote ( string Zeichenkette [, string Begrenzer] )
 
Besten Dank Sascha

Das Thema sollte ich mir nocheinmal zu Herzen führen. Obschon es sehr abstrakt ist!

Gruz René
 
Zurück
Oben