php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
Alt 29.04.2011, 11:32  
Neuer Benutzer
 
Registriert seit: 29.04.2011
Beiträge: 5
PHP-Kenntnisse:
Fortgeschritten
Jay84 befindet sich auf einem aufstrebenden Ast
Standard Suchergebnisse formatieren

Hallo Leute,

ich bin neu hier im Forum. Bisher bin ich immer gut mit Google & Co gefahren und konnte alle meine Problemstellungen schnell lösen. Auf mein folgendes Problem habe ich keine Antwort gefunden, daher habe ich mich hier angemeldet, in der Hoffnung ihr könnt mir helfen.

Ich habe ein eigenes CMS geschrieben, das genau auf unsere Kunden ausgerichtet ist. Natürlich darf in so einem CMS eine Suchfunktion nicht fehlen. Suchfunktion etc. funktioniert auch soweit. Was mir Kopfzerbrechen bereitet, ist die Darstellung des Suchergebniss-Strings.

Die Suchbegriffe im Ergebnis werden mit preg_replace gehighlighted, nachdem den Ergebnistext sinnvoll gekürzt wird.
Das funktioniert mit einem Suchbegriff auch wunderbar:

PHP-Code:
$resultText substr($pageContentstripos($pageContent$searchstr)-70140 strlen($searchstr));
$resultText preg_replace("/($searchstr)/i""<span class='searchResultHighlight'>$1</span>"$resultText); 
Hier wird also vor und nach dem Suchergebnis 70 Zeichen Fleisch dazu gegeben.


Jetzt mein Problem:
Wenn in der Suche mehrere Suchbegriffe angegeben werden, die mit UND verknüpft sind, sollen ja auch mehrere Suchergebnisse angezeigt werden. Ich bringe die Suchbegriffe in einen Array. Sie so preg_replace zu übergeben funktioniert ja auch wunderbar. Nur wie kriege ich meinen Text sinnvoll so gekürzt, dass gerade die gefundenen Begriffe angezeigt werden, sich aber nichts doppelt und auch nur jeder Begriff mindestens einmal vorkommt?

Ich habe es so versucht:
($arr ist der Array mit den Suchergebnissen, $arr_preg enthält die Pre- und Suffixe für die Preg-Funktion)
PHP-Code:
$resultText "";
for(
$s 0$s sizeof($arr); $s++) {
$resultText.= substr($pageContentstripos($pageContent$arr[$s])-70140) . " ... ";
}
$resultText preg_replace($arr_preg"<span class='searchResultHighlight'>$1</span>"$resultText); 
Hier wird immer das erste Vorkommen des Begriffs im Text gesucht und davor und dahinter 70 Zeichen Fleisch mitgegeben. Das ganze kommt in eine Variable, die am Ende angezeigt wird.
Das funktioniert, wenn die Suchbegriffe im Text weit genug auseinander liegen.
Suche ich aber z.B. "Franz und Taxi" im Text "Franz jagt im vollkommen verwahrlosten Taxi quer durch Berlin." wäre das Ergebnis: "Franz jagt im vollkommen verwahrlosten Taxi quer durch Berlin. ... Franz jagt im vollkommen verwahrlosten Taxi quer durch Berlin.", weil erst Franz gefunden wird, und dann Taxi und jeweils 70 Zeichen davo und dahinter mitgenommen und das Ganze hintereinander gesetzt wird.

Ich hoffe ihr versteht mein Problem.


Kurz und knapp also nochmal die Frage:
Wie kürze ich einen Text sinnvoll, sodass bestimmte Begriffe mindestens einmal bestehen bleiben und der Sinnzusammenhang mit dem Begriff jeweils erhalten bleibt? (Eigentlich wie bei Google).

Ich würde mich über eure Hilfe sehr freuen!

Danke & Grüße,
Jay
Jay84 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 29.04.2011, 11:49  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

dein "Problem" hat ja wenig mit PHP zu tun, mehr mit Logik und Softwaredesign, von daher verschiebe ich das mal. Wäre aber schön wenn du noch nen sinnvollen Titel vergeben würdest

[MOD] *verschoben*
cycap ist offline   Mit Zitat antworten
Alt 29.04.2011, 14:11  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Also erst mal würde ich mir die Positionen der einzelnen Begriffe im Text heraussuchen, und die entsprechenden „Intervalle“ berechnen (+/- 70 Zeichen „Fleisch“).

Dann schauen, wo sich diese Intervalle ggf. überlappen.
Wenn der Suchtreffer „foo“ inkl. seinem „Fleisch“ von 37 - 180 geht, und „bar“ von 72 - 215 - dann überlappen sich diese beiden Bereiche, und sind zu einem Bereich von 37 - 215 zusammen zu ziehen.

Das funktioniert so natürlich nur auf reinem Textinhalt.
Wenn es sich um Daten innerhalb von HTML-Code handelt, wäre das ganze sehr viel komplexer.
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Alt 29.04.2011, 18:40  
Neuer Benutzer
 
Registriert seit: 29.04.2011
Beiträge: 5
PHP-Kenntnisse:
Fortgeschritten
Jay84 befindet sich auf einem aufstrebenden Ast
Standard

Hi ChrisB,

danke für deine Antwort.
Das ist denke ich schon mal ein guter Ansatz. Allerdings habe ich jetzt ein bisschen hin und her überlegt, wie man das praktikabel umsetzen könnte, damit die Auswertung nicht zu lange dauert.
Ohne komplexe Gebilde mit Arrays die die Intervalle speichern und mit Schleifen durchsucht werden, wüsste ich keinen Weg - und selbst da habe ich nur eine vage Vorstellung...

Sagen wir wir haben (in einem einfachen Beispiel) die Intervalle 5-10, 7-12, 25-30 und 3-8. Dann bräuchte ich als Antwort 3-12 und 25-30.
Gibt's da nen schlauen Weg?

Wie würdest du denn deine Idee phptechnisch Umsetzen?

Danke & viele Grüße,
Jay
Jay84 ist offline   Mit Zitat antworten
Alt 29.04.2011, 18:59  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Da würde ich, bevor ich mir das selber überlege, erst mal schauen, wie das andere vielleicht schon umgesetzt haben - Überlappungen in Intervallen zu finden, ist ja bestimmt eine Problematik, mit der sich auch andere schon beschäftigt haben.

http://www.google.com/search?q=joini...+intervals+php
Die Suchabfrage zu modifizieren, um ggf. bessere/spezifischer zum Problem passende Ansätze zu finden, bleibt erst mal dem interessierten Mitleser überlassen
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Alt 30.04.2011, 14:02  
Erfahrener Benutzer
 
Benutzerbild von fireweasel
 
Registriert seit: 20.03.2010
Beiträge: 474
PHP-Kenntnisse:
Fortgeschritten
fireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblick
fireweasel eine Nachricht über ICQ schicken fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken fireweasel eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von Jay84 Beitrag anzeigen
...
Sagen wir wir haben (in einem einfachen Beispiel) die Intervalle 5-10, 7-12, 25-30 und 3-8. Dann bräuchte ich als Antwort 3-12 und 25-30.
Gibt's da nen schlauen Weg?
Endlich mal ein praxisnahes Problem, wo mir die Anwendung von array_reduce() sinnvoll erscheint:

PHP-Code:
$offsets = array (
    array (
510),
    array (
712),
    array (
2530),
    array (
38),
);

// nach dem Start-Offset sortieren
usort(
    
$offsets,
    function(
$a$b) {
        return 
$a[0] - $b[0];
    }
);

// Ueberlappungen "ausfiltern"

$fold array_reduce(
    
$offsets,
    function(
$accu$item) {
        
$before end($accu);
        if (
$item[0] <= $before[1]) {
            if (
$item[1] > $accu[key($accu)][1]) {
                
$accu[key($accu)][1] = $item[1];
            }
        }
        else {
            
$accu[] = $item;
        }
        return 
$accu;
    },
    array ()
);

var_dump($fold); 
fireweasel ist offline   Mit Zitat antworten
Alt 02.05.2011, 19:28  
Neuer Benutzer
 
Registriert seit: 29.04.2011
Beiträge: 5
PHP-Kenntnisse:
Fortgeschritten
Jay84 befindet sich auf einem aufstrebenden Ast
Standard

Das sieht doch schon mal sehr gut aus! Danke Leute, ich probiert das mal aus. Wenn ich mich nicht mehr melde, hat's geklappt )
Jay84 ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
JPGraph - Graph formatieren, Uhrzeit auf x-Achse Bjoern PHP Einsteiger 6 22.04.2011 13:42
Variable für Get übergabe formatieren Samuel PHP Einsteiger 4 23.02.2011 14:17
Tabelle mit CSS formatieren? hallo1995 HTML, Usability und Barrierefreiheit 5 23.06.2009 17:56
input type="file" mit css formatieren rooomka HTML, Usability und Barrierefreiheit 10 25.03.2009 22:05
Inhalt eines Textfeldes formatieren obi JavaScript, Ajax und mehr 1 17.02.2009 00:02
MySQL - Suchergebnisse durch User nachträglich neu sortieren echo PHP Tipps 2008 6 23.12.2008 12:24
Include Datei formatieren st0ny PHP Tipps 2008 12 31.07.2008 12:35
Frames & Scrollleisten zentral formatieren HTML, Usability und Barrierefreiheit 9 02.01.2006 13:02
wie kann ich das datum formatieren: bendigo Datenbanken 4 30.08.2005 13:43
mail subject formatieren bexxta PHP Tipps 2005-2 1 27.08.2005 13:34
Excel mit PHP formatieren PHP Tipps 2004-2 9 22.11.2004 11:12
Per Button Text formatieren Igäl HTML, Usability und Barrierefreiheit 1 11.11.2004 06:25
[Erledigt] Preisanzeige formatieren PHP Tipps 2004-2 2 05.11.2004 21:32
TIME-Feld formatieren RudiS Datenbanken 4 16.07.2004 16:16
Abgerufenen Text formatieren PHP Tipps 2004 14 27.06.2004 21:11

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
google suchergebnisse formatieren, obi, suchergebnisse formatieren, preg_replace prefix suffix span highlighting, google ergebnisse formatieren, google suche ergebnis formatiert, suchergebnis formatieren, php suchergebnisse formatieren, google sucheergebnis formatieren, php suchergebnis sortieren, php suchergebnis formatieren, google suche ergebnisse formatieren, ajax suchergebnis formatieren, php text finden und formatieren, php suchergebnis auswerten, php such ergebnisse sortieren

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:35 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum