Hallo Experten,
Gibt es einen von mir bisher übersehenen Regexp-modifier bzw. -switch mit dem ich nach _mehreren_ Wörtern suchen kann, die in _beliebiger_ Reihenfolge vorkommen können, wobei aber jedes der Wörter wenigstens einmal vorhanden sein muss?
Beispiel:
Text:
'hans war gestern irgendwie komisch'
gesucht werden:
'gestern'
'komisch'
'hans'
'matchender' (aber sehr umständlicher) regulärer Ausdruck
(und noch ohne Berücksichtigung der Wortgrenzen):
$re = '/(gestern.*komisch.*hans)|(gestern.*hans.*komisch)|(komisch.*gestern.*hans)| (etc.) /'
---
Hintergrund der Frage ist eine MySQL-Tabelle mit _mehreren_ Textfeldern.
Die Suche soll für jeden einzelnen Datensatz genau dann als erfolgreich gelten, wenn der gesuchte reguläre Ausdruck auf alle seine Textfelder _zusammen_ zutrifft.
Dadurch erhöht sich die Verknüpfungsdimension noch zusätzlich; und ich denke mal, dass in so einem Fall eine WHERE-clause der Form:
"WHERE CONCAT_WS(' ', feld1, feld2, feld3) REGEXP '$re'"
die resourcenschonendste Variante ist, denn andernfalls wäre folgendes notwendig:
"WHERE CONCAT_WS(' ', feld1, feld2, feld3) REGEXP '$re1' [ $re1 = '/(^|\W+)gestern($|\W+)/' ]
AND CONCAT_WS(' ', feld1, feld2, feld3) REGEXP '$re2' [ $re2 = '/(^|\W+)komisch($|\W+)/' ]
AND CONCAT_WS(' ', feld1, feld2, feld3) REGEXP '$re3'" [ $re3 = '/(^|\W+)hans($|\W+)/' ]
(Also mehrere CONCAT_WS- und REGEXP-Aufrufe. Ohne REGEXP komme ich auch in diesem Fall nicht aus wegen der Wortgrenzen. Ich kann nämlich nicht
"WHERE CONCAT_WS(' ', feld1, feld2, feld3) LIKE '%hans%'
..."
verwenden, da ja einerseits nicht 'hans' aus '...hansa...' oder '...hanse...' -
andereseits aber 'hans' aus
'... hans ...'
'... hans,...'
'... hans!...'
etc.
sehr wohl gefunden werden soll.)
---
Ich hoffe mein Problem einigermaßen deutlich beschrieben zu haben...
Also nochmal die Frage: Wie läßt sich ein regulären Ausdruck konstruieren, der auf mehrere Wörter in beliebiger Reihenfolge zutrifft? Geht das nur über die Aneinanderreihung aller möglichen Kombinationen - oder gibt es eine andere Möglichkeit?
Grüße,
Sancho