Möglichkeit der Volltextsuche über RegEx?

CasparJones

Grünschnabel
Hallo Leute,

ich habe follgendes Problem:

Ich will einen Text (genau genommen eine E-Mail) nach bestimmten Ausdrücken durchsuchen die mit logichen Verknüpfungen zusammen gesetzt werden können auch volltext suche genannt ;-)

Beispiel:
User AND unknown

Mein erster Ansatz war in der RegEx zu schreiben.
^(.*)User(.*)unknown(.*)$ zu schreiben, aber das funktioniert nur solange dort
User unknown steht sobald unknown User steht würd die RegEx nichts mehr finden. Jetzt bin ich schon soweit das ich bei der Und verknüpfung schreiben kann
^(.*)(unknown(.*)user|user(.*)unknown)(.*)$
das würde dann mit jeglicher weiteren AND verknüpfung wachsen...

Nur wie soll ich da jetzt OR verknüpfungen einbauen?
Hat jemand eine Idee oder vieleicht ein Gedankenansatz wie man über RegEx das Problem noch besser lösen kann oder ein ganz anderen Ansatz?

Bin für jegliche Hilfestellungen Dankbar...
:-)

Lieben Gruß
Euer CasparJones
 
hi,
Ich gehe mal davon aus, dass du den Befehl [phpf]preg_match[/phpf] nutzt, dieser Bricht nach dem ersten Ergebnis ab. Wenn du hingegen den Befehl [phpf]preg_match_all[/phpf] verwendest wird das ganze Dokument durchsucht und die Ergebnisse werden meiens Wissens nach in dein Array geschrieben.
Solltest du den PHP Internen RegExp Befehlssatz benutzen würde ich dir empfehlen auf die Perl Variante aufgrund größerer vielseitigkeit und gescheiter Modifier umzusteigen...

Zweiter Ansatz wäre die Verwendung der Tags die du selbst gemacht hast
Nach dieser RegExp
/^(.*)User(.*)unknown(.*)/
würdest du in deinem Treffer-Array folgendes finden:
$treffer[0] = zu durchsuchender String
$treffer[1] = der Text vor "User"
$treffer[2] = der Text zwischen "user" und "unknown"
$treffer[3] = der text nach unknown (sprich der Rest)
...wenn es dir lieber ist, kannst du so lange ein rest übrig ist und Treffer erzielt werden per Schleife immer wieder in [3] suchen, ist aber etwas umständlich

[edit]
ah, frage falsch verstanden...
1. : | = OR , & = AND!
2.: wenn du User [bla] unknown und unknown [bla] User finden willst würde ich spontan /(.*)(unknown.*user|user.*unknown)(.*)/ vorschlagen


Gruß
TiM
 
Zuletzt bearbeitet:
Hallo....

mit RegExp alleine wird das wahrscheinlich kaum sinvoll machbar sein.(nicht mal, wenn man sie per Hand eintippt...und ich nehm mal an, das hast du nicht grad vor)

Hier mal mein Lösungsversuch... funktioniert vorwiegend über Arrays:
Code:
function find($strMail, $strQuery)
{
    //Wiederholte Whitespaces entfernen...
    $strMail  = preg_replace('/\s+/', ' ', $strMail);
    $strQuery = preg_replace('/\s+/', ' ', $strQuery);


    if (preg_match('/\S/', $strQuery))
        {
        //Anfrage anhand "OR" splitten
        $arrQuery = explode(' OR ',$strQuery);

        //Array-Elemente durchlaufen
        foreach ($arrQuery as $key => $value)
            {

            //Array-Element anhand "AND" splitten
            $arrQuery[$key]=explode(' AND ',$arrQuery[$key]);

            for($j=0;$j<count($arrQuery[$key]);++$j)
                {
                //Regexp für einzelnes Suchwort
                $pattern='/('.$arrQuery[$key][$j].')/i';

                if(!preg_match($pattern,$strMail))
                    {
                    //wurde Muster nicht gefunden, nächster Durchlauf
                    break;
                    }

                if($j==count($arrQuery[$key])-1)
                    {
                    //jeder Suchbegriff wurde gefunden...
                    //Meldung und Funktion verlassen
                    echo 'bingo!';
                    return;
                    }
                }
            }
        }

//Nix gefunden
echo ":sad:";
}

Test
 
DANKE

DANKE für die guten Antworten,
schade das es mit RegExpressions nicht möglich ist, aber deine Möglichkeit ist auch sehr sehr gut,

Vielen Vielen Dank für deine Mühe; soviel Arbeit wie du dir gemacht hast :-)

Greetz
CaS

P.S.: Sorry das ich mich erst so spät melden konnte, hatte ziemlich viel Stress... aber lieber etwas spät als gar keine rückmeldung gelle :-)
 
Zurück