MySQL Suche mit Filterfür HTML-Tags

Funky_MF

Erfahrenes Mitglied
Hallo,

für eine Suchfunktion auf einer Website möchte ich die Suche nur auf den Text beschränken. Die Inhalte sind als TEXT gespeichert und enthalten auch HTML-Tags, bei der Suche möchte ich aber jetzt von vornherein nur im Text suchen und nicht in den Tags.

Das könnte dann so ähnlich aussehen:
Code:
mysql>SELECT * FROM tabelle WHERE text NOT LIKE '<%>'
Allerdings funktioniert das nicht, weil ja grundsätzlich immer ein '<' am Anfang und ein '>' am Ende eines HTML-Blocks steht. --> <div>blablabla</div>
Es müsst also nur zwischen den Tags gesucht werden.

Hat jemand eine Idee ? Evtl. mit einer Reg-Ex ?
 
Kannst du mir bitte genau erkären was du machen möchtest? Ich hege nämlich die Vermutung, daß du mit einem falschen Werkzeug an die Sache herangehst.

Mit freundlichen Grüßen

Alexander Schell
 
Re: MySQL Suche mit Filter für HTML-Tags

Ich möchte im Output einer Suchfunktion den Suchstring highlighten. Hierfür würde ich den gesuchten Begriff im Ergebnis mit PHP str_replace eine entsprechende Formatierung zuweisen.
Wenn aber jetzt der gesuchte Begriff innerhalb von Html-Tags auftaucht, würde das den ganzen HTML-Code zerhauen.
Falls ich mit meinem Ansatz nicht richtig liegen sollte, müsste ich eben im Suchergebnis nach HTML-Tags suchen, diese zunächst entfernen, die str_replace Funktion durchführen und die Tags wieder an der richtigen Stelle einfügen und das stell ich mir bedeutend aufwändiger vor.
 
Hallo

Also generell ist ein Datenbank-Server kein Werkzeug zum parsen oder durchsuchen von Dokumenten... :)
Du kannst zwar wunderbar deinen Text darin speichern, aber die Verarbeitung dieses Textes sollte ein geeignetes Programm beziehungsweise selbst geschriebene Routine übernehmen.
Ich würde dir folgendes Vorschlagen: Selektiere einfach deinen gewünschten Text und wirf ihn in eine geeignete Routine. Je nach Sprache die du benutzt stehen dir verschiedene Möglichkeiten offen.

Schönen Tag noch

Alexander Schell
 
Danke für deine Bemühungen, aber mir ist gerade selbst eine Lösung eingefallen, wie ich das mit dem Highlighten im Output hinbekomme.

Aber trotz allem wäre es doch besser, gäbe es eine Möglichkeit, eine Suche so zu spezifizieren, daß der Output wirklich nur das enthält, was ich suche.
Um es nochmal klar zu verdeutlichen, mein zu durchsuchender Inhalt, welcher in der DB gespeichert ist, enthält nunmal einen kompletten HTML-Block, und ich möchte verhindern, daß in den HTML-Tags gesucht wird, da lag ich doch mit meinem obigen Ansatz nicht ganz falsch, oder ?
 
Du könntest es über einen FULLTEXT -Index probieren.

Insofern die diversen Tags in recht vielen Spalten vorkommen(>50%), würden sie beim Anlegen des Index übergangen....somit nicht gefunden.
 
Hallo

Eine Datenbank verwaltet Objekte mit verschiedenen Eigenschaften. Die Zeilen einer Tabelle repräsentieren ein solches Objekt - zum Beispiel einen Kunden - und die Spalten dessen Eigenschaften. Im Falles des Kunden zum Beispiel seinen Namen. Auf diese Eigenschaften kann in aller Regel nur komplett zugegriffen werden und nicht auf Teile. Die Verarbeitung der Inhalte dieser Eigenschaften ist nicht Aufgabe eines Datenbank-Servers. Dazu ist er nicht gebaut. Deswegen solltest du die Suche auch nicht versuchen - wenn das überhaupt geht, was ich bezweifele - auf den Datenbank-Server abzuwälzen, sondern sie da zu behandeln wo sowas hingehört: In deiner Anwendung.

Schönen Tag noch

Alexander Schell
 
Ich könnte eine grobe ungetestete Idee mit REGEXP anbieten. Ob das funktioniert, kann ich nicht versprechen:
Code:
... `feld` REGEXP '>[^<]*Suchbegriff'
Die Regex-Syntax ist bestimmt noch nicht ganz richtig, aber die Art, wie ich versuchen würde, Tags auszuschließen sollte klar werden (-> finde das Ende des Tags, erlaube keinen neuen Tag-Anfang, finde den Suchbegriff). Um auch in Texten zu suchen, die nicht mit einem Tag beginnen, müßte man vielleicht mit oder noch einen zweiten Ausdruck anfügen:
Code:
... `feld` REGEXP '^[^<]*Suchbegriff'
Hier: ->Finde, vom Anfang des Textes suchend, keinen Tag-Anfang und dann den Suchbegriff.

Die richtige Syntax für reguläre Ausdrücke müsstest Du Dir selbst noch zusammensuchen.

Gruß hpvw

EDIT: Neugier überwiegt. Ich habe es getestet und es funktioniert in meinem Testfall. Es mag vielleicht nicht jeden Fall der HTML-Syntax abdecken, das kann ich so ad hoc einfach nicht überblicken, aber in Standardsituationen scheint es zu funktionieren. Hier mein Beispiel:
Code:
mysql> select * from htmlsuche;
+----+----------------------------------------------------------------+
| id | html                                                           |
+----+----------------------------------------------------------------+
|  1 | <html>bla suchbegriff bla</html>                               |
|  2 | bla suchbegriff bla<tag>blub foo</tag> bla                     |
|  3 | bla bla<tag>blub foo</tag> bla suchbegriff                     |
|  4 | bla bla<tag>blub suchbegriff foo</tag> bla                     |
|  5 | bla <tag attrib="suchbegriff">blub foo</tag> bla suchbegriff   |
|  6 | bla bla <tag attrib="suchbegriff">blub foo</tag> bla           |
|  7 | bla <tag suchbegriff="value">blub foo</tag> bla suchbegriff    |
|  8 | bla bla<tag suchbegriff="value">blub foo</tag> bla             |
|  9 | <html>sb nicht vorhanden</html>                                |
| 10 | sb nicht vorhanden <tag>hier auch nicht</tag> immer noch nicht |
+----+----------------------------------------------------------------+
10 rows in set (0.00 sec)

mysql> select * from htmlsuche
    ->   where `html` REGEXP '>[^<]*suchbegriff'
    ->      or `html` REGEXP '^[^<]*suchbegriff';
+----+---------------------------------------------------------------+
| id | html                                                          |
+----+---------------------------------------------------------------+
|  1 | <html>bla suchbegriff bla</html>                              |
|  2 | bla suchbegriff bla<tag>blub foo</tag> bla                    |
|  3 | bla bla<tag>blub foo</tag> bla suchbegriff                    |
|  4 | bla bla<tag>blub suchbegriff foo</tag> bla                    |
|  5 | bla <tag attrib="suchbegriff">blub foo</tag> bla suchbegriff  |
|  7 | bla <tag suchbegriff="value">blub foo</tag> bla suchbegriff   |
+----+---------------------------------------------------------------+
6 rows in set (0.00 sec)

Noch'n Edit:
@DealeyLama
Ich würde die Aussage, dass eine Datenbank nicht zum verarbeiten von Inhalten da ist nicht so pauschal treffen. Wenn Du vieles im Query erledigen kannst, ist Deine Applikation leichter auf andere Anwendungssprachen übertragbar, da Du nur die Queries mitnehmen musst, beispielsweise bei einer Umstellung von PHP auf JSP. Wenn man sich ein bisschen mit spezifischen Funktionen zurückhält, ist auch die Umstellung auf ein anderes DBMS nicht so schlimm. Ich habe mit PHP und MySQL die Erfahrung gemacht, dass es meist performanter ist, vieles von der Datenbank erledigen zu lassen und PHP gar nicht erst so viele Ergebnisse zukommen zu lassen. Vermutlich ist die Schnittstelle zwischen MySQL und PHP nicht die schnellste.
Bei großen Datenbanken würde ich Dir allerdings recht geben, da es leichter ist, Webserver bzw. die Server für die weiterverabeitende Anwendung zu skalieren, als einen Datenbankserver.
 
Zuletzt bearbeitet:
Zurück