Willkommen im neuen Forum von concrete5.de.
Die Anmeldung ist ab dem 15.10.2020 nur noch mit E-Mail Adresse und Passwort möglich. Eine Anmeldung mit Benutzername ist nicht mehr möglich.

Diese Nachricht löschen.
Anhang entfernen?
Zurück zur Themenliste
A
Ade 0.png 15.02.2011 16:07

Umlaute in der Suche

Hallo,

ich bin neu hier im Forum. Ich bin dabei eine Website mit C5 umzusetzen. Erstmals habe ich dabei die Suche integriert. Dabei habe ich mich zur Einbindung des Suchergebnisses an die Beschreibung unter
http://www.concrete5.org/community/forums/documentation_efforts/how-to-render-search-results-in-a-specific-area/
gehalten.

Die Sucheingabe habe ich im Template fest eingebunden:
<form action="<?php echo View::url('search'); ?>" id="search">
<input id="searchfield" value="" type="text" /><input id="searchbutton" name="submit" type="submit" value="START" /><br />
<p>Suchbegriff eingeben</p>
</form>

Dieser Ablauf funktioniert! Doch sobald die Ausgabe auf einen deutschen Umlaut stößt oder die Suchanfrage selbst diesen enthält kommt es zu Fehlern.

Im ersten Fall wird die weitere Ausgabe abgeschnitten - also bevor die 150 Zeichen des BodyContents ausgegeben wurden.
Im zweiten Fall wird der Suchbegriff mit ?query=äöü (beispielhafter Suchbegriff mit dt. Umlaut) an die Suche übergeben. Doch selbst wenn dieser Begriff sicher in der Site vorkommt, wird nichts gefunden.

In diesem Fall ist mir aufgefallen, dass der query den Umlaut nicht in Entities wandelt, die Datenbank die Inhalte jedoch encodiert enthält.

Leider sind meine PHP-Kenntnisse zu schlecht, um den richtigen Ansatz für die Manipulation des View::url-Aufrufes so zu setzen, dass vglbar htmlentities(query) in der URL übergeben wird.

Bei der Ausgabe der Suchergebnisse vermute ich die gleiche Problematik.

Danke für jede Hilfe.
R
RII 0.png 17.02.2011 08:16
Welche Kodierung hat denn die Datenbank bzw. wie sehen die Umlaute in der DB aus?
A
Ade 0.png 17.02.2011 09:59
Hallo RII,

ich habe eine MySQL-DB mit
MySQL-Zeichensatz: UTF-8 Unicode (utf8)
Zeichensatz / Kollation der MySQL-Verbindung: utf_general_ci

Die Textinhalte sind alle in HTML-Entities gewandelt. Also anstelle von für - f&uuml;r.
R
RII 0.png 18.02.2011 14:34
Hallo ade,
hmmm das ist sehr komisch, ich habe es auch erst jetzt gemerkt auch auf concrete5.de geht es nicht!!!
Das Problem war früher schon bekannt weil concrete5 lucene benutzt für die Suche!
Ich dachte allerdings das es mit dieser Version 5.4.1 das Problem gelöst worden ist.
Ich werde mal schauen wo der Fehler liegt.
Rii
R
RII 0.png 22.02.2011 11:36
Es ist wohl ein Bug!
Probier es hiermit
öffne: concrete/blocks/search/controller.php
und suche nach(do_search function):


die zweite Zeile muss auskommentiert werden:
R
RII 0.png 22.02.2011 12:01
Ich denke die obige lösung ist funktioniert nicht sehr gut!
Ich muss erstmal meine Kenntnisse in regulären Ausdrücken ein wenig auffrischen:P! Ich hoffe ich habe bis zum WE eine Lösung
A
Ade 0.png 22.02.2011 13:27
Hallo RII,

ich bin zwischenzeitlich auch etwas weiter gekommen. Der Ansatz ist ähnlich. Vom Ablauf her habe ich in der Datei controller/search.php die Funktion do_search() wie folgt abgeändert:
function do_search() {
$q = $_REQUEST['query'];
$q = htmlentities($q, ENT_COMPAT, APP_CHARSET);

Loader::library('database_indexed_search');
$ipl = new IndexedPageList();
$ipl->filterByKeywords($q);

if( is_array($_REQUEST['search_paths']) ){
foreach($_REQUEST['search_paths'] as $path) {
//if(!strlen($path)) continue;
$ipl->addSearchPath($path);
}
}

$res = $ipl->getPage();

foreach($res as $r) {
$results[] = new IndexedSearchResult($r['cID'], $r['cName'], $r['cDescription'], $r['score'], $r['cPath'], $r['content']);
}

$this->set('query', $q);
$this->set('paginator', $ipl->getPagination());
$this->set('results', $results);
}
Ich habe die Suchanfrage in Entities gewandelt und dafür den Code unter $this->set('query', … nach oben genommen. Unten wiederum nur noch die Variable belassen.

Der Funktionsaufruf highlightedExtendedMarkup() hat mit seinen RegEx-Einträgen auch kein deutsch berücksichtigt. Zudem ist mein Text voller Sonderzeichen und so habe ich an dieser Stelle auch noch eine Veränderung vorgenommen.
public function highlightedExtendedMarkup($fulltext, $highlight) {
$text = @preg_replace("#
|
#", ' ', $fulltext);

$matches = array();
$highlight = str_replace(array('"',"'","&quot;"),'',$highlight); // strip the quotes as they mess the regex

$regex = '([[:alnum:][:blank:][:space:][:punct:]]{0,45})'. $highlight .'([[:alnum:][:blank:][:space:][:punct:]]{0,45})';
preg_match_all("#$regex#i", $text, $matches);

if(!empty($matches[0])) {
$body_length = 0;
$body_string = array();
foreach($matches[0] as $line) {
$body_length += strlen($line);

$body_string[] = $this->highlightedMarkup($line, $highlight);

if($body_length > 150)
break;
}
if(!empty($body_string))
return @implode("....", $body_string);
}
}

Doch nun verlässt mich bislang das Können. Da der Text nun in HTML-Entities eingesetzt wird und durch $regex nach 45 Zeichen vor bzw. nach dem Suchbegriff abgeschnitten wird, kann es vorkommen, dass mitten im HTML-Entity abgeschnitten wird. Dies führt zu unschönen ausgaben wie &fuu

Ich werde mich heute wieder dem Problem widmen können. Insofern hoffe ich, dass ich die Lösung weiter vervollständigen kann.
A
Ade 0.png 24.02.2011 09:33
Nachdem ich mich gestern nocheinmal intensiv mit der Suchausgabe beschäftigen konnte, hier nun mein vorläufiges Endergebnis:
Ich konnte die Suchausgabe noch soweit verbessern, dass Sie nicht immer abgeschnitten wird. Da die reine Suche nach einem Leerzeichen vom Beginn des Strings mir auch schon mal den Suchbegriff entfernt hat, habe ich dort noch eine zusätzliche Abfrage eingesetzt. Doch für's Optimum fehlt leider noch etwas.

Die Änderung betrifft wieder die Funktion highlightedExtendedMarkup …

public function highlightedExtendedMarkup($fulltext, $highlight) {
$text = @preg_replace("#
|
#", ' ', $fulltext);

$matches = array();
$highlight = str_replace(array('"',"'","&quot;"),'',$highlight); // strip the quotes as they mess the regex

$regex = '([[:alnum:][:blank:][:space:][:punct:]]{0,48})'. $highlight .'([[:alnum:][:blank:][:space:][:punct:]]{0,55})';

preg_match_all("#$regex#i", $text, $matches);

if(!empty($matches[0])) {
$body_length = 0;
$body_string = array();
foreach($matches[0] as $line) {
$strings = $line;
$strings = substr($line, strpos($line, " "), (strrpos($line, " ") - strpos($line, " ")));
if (stripos($strings, $highlight) !== false) {
$line = $strings;
}

$body_length += strlen($line);

$body_string[] = $this->highlightedMarkup($line, $highlight);

if($body_length > 150)
break;
}
if(!empty($body_string))
return @implode("....", $body_string);
}
}
Ich hoffe der Ansatz kann zumindest mit in zukünftige Entwicklungen einfließen. Besser als die aktuelle Funktionalität ist es in jedem Fall.
E
exzesse 0.png 15.06.2011 17:36
Hallo,

die oben angegebenen Quelltextanpassungen helfen schon weiter, allerdings werden im Suchfeld nach Klick auf den "Senden"-Button die Umlaute jetzt in HTML-Codierung (z.B. &uuml; für ü) im Suchwort angezeigt. In den Suchergebnissen passiert das nicht, allerdings werden alle Seiten "gefunden". ohne Umlaute gibt es diese Probleme nicht. Wo muss ich noch was wie einstellen?

Danke für Hilfe und Tipps!
A
Ade 0.png 16.06.2011 08:58
Hallo exzesse,

beim von mir beschriebenen Ablauf wird nach Auslösen der Suche - zumindest bei mir - das Suchfeld geleert. Daher kann ich nicht nachvollziehen, wo du die Encodierung siehst.

Auf der von mir eingerichteten Website http://www.druckerei-nees.de wird der Suchbegriff in der variablen query mit übergeben. Das sieht dann beispielsweise so aus: http://www.druckerei-nees.de/index.php/search/?query=Jubiläum&submit=START (Link hovern und in der Statuszeile kontrollieren; wird leider in der Ansicht abgeschnitten)

Vielleicht weicht dein Aufbau ja noch an einem Punkt vom beschriebenen Aufbau ab. Sorry, aber mehr kann ich im Moment nicht dazu beitragen. Vielleicht postest du mal einen Link, unter dem man sich das ansehen kann.

Gruß

Ade

Nachricht hinzufügen