[MySQL] Regexp verhindern das buchstaben doppelt genutzt werden

darkii

Mitglied
Hallo Community,

kurze und warsch. leichte Frage auf die ich einfach nicht komme ;)

Ich habe mit regexp folgende Abfrage: $sql = "SELECT * FROM test WHERE wort REGEXP '^[$var1]+$'";


Bei einer eingabe erhält die Variable Wörter durcheinander zb. Suam aus dem die Abfrage dann Maus bildet leider bildet sie daraus auch mama und das möchte ich verhindern.

Also einfach verhindern das die in der Variablen gegebenen Buchstaben doppelt genutzt werden ;)

Ich bin bereits im netz auf diesen Code: /(.)\\1{3,}/sS',' gestossen aber der erfüllt nicht ganz den Zweck ;) Jemand tipp oder besser gesagt Lösungsvorschlag ****
 
Nur damit ich es richtig verstehe.
Du gibst in ein Textfeld Buchstaben in beliebiger Reihenfolge ein und die Abfrage soll dann alle Wörter liefern die mit diesen Buchstaben gebildet werden können und es muss jeder Buchstabe enthalten sein!?
 
Mit MySQL so direkt und einfach nicht lösbar
Arbeitest du mit PHP? Ansonsten muss eine Stored Procedure hinzu.

Nachtrag:
zB. so kannst du ein Where zusammensetzen
PHP:
$text = 'Saum';

$variants = array_map('implode', permutation(str_split(strtolower($text))));
$where = 'FIND_IN_SET(LOWER(`text`), \''.implode(',', $variants).'\')'; 
//TODO: Hier das $where an ein SQL-Statement anhängen und an die DB schicken....

//Die Funktion permutation habe ich aus dem WWW kopiert
//http://forum.webstatt.org/thread.php?postid=10775
function permutation($list, $clean = true) {
    // Das Nirvana fuer kommende Permutanten
    $res = array();
    
    // Elemente der Liste durchlaufen
    for ($i = 0; $i < count($list); $i++) {
        $_list = $list;
        // Ein Element ausschneiden ...
        list($elm) = array_splice($_list, $i, 1);
        $_res = $_list;
        // ... und an's Ende anhaengen
        array_push($_res, $elm);
        // Ab in's Nirvana!
        $res[] = $_res;
        // Dieses Ergebnis weiter permutieren -- allerdings
        // ohne das vorhin wieder angehaengte Element ...
        $perm = permutation($_list, false);
        // ... welches wir nun wieder anhaengen
        foreach ($perm as &$p) {
            if (is_array($p)) // Ergebnisse?
                array_push($p, $elm);
        }
        // Neue Permutationen an's Nirvana anhaengen
        $res = array_merge($res, $perm);
    }
    // Duplikate loeschen
    if ($clean) {
        // Arrays zu Strings konvertieren, um dann ...
        foreach ($res as &$r)
            $r = serialize($r);
        
        // ... vergleichen zu koennen ...
        $res = array_unique($res);
        
        // ... und wieder zu Arrays zu konvertieren
        foreach ($res as &$r)
            $r = unserialize($r);
    }
    return $res;
}

$where im obigen Beispiel:
SQL:
FIND_IN_SET(`text`, 'aums,umas,muas,amus,maus,uams,suma,umsa,musa,smua,msua,usma,samu,amsu,masu,smau,msau,asmu,saum,ausm,uasm,suam,usam,asum')
 
Zuletzt bearbeitet von einem Moderator:
ja ich arbeite mit php ja.. hätte es gerne mit regexp gelöst aber so in etwa hab ichs auch geschrieben :

PHP:
<!DOCTYPE HTML>
<html>
 <head>
  <title> Test </title>
  <!--
  
    <link rel="stylesheet" type="text/css" href="style2.css">
    -->
 </head> 
<body>
 <div id="header">
   <img src="header.jpg" >
   
  </div>
<div id="formular">
<form action="try.php" method="POST" button="ok">
<input type="text" size="30" name="Buchstabenfolge">
<INPUT TYPE=SUBMIT VALUE="Abschicken">
</div>
</form>
<br>
<br>
<?php
include("db-verbindung.php");
$var1 = $_POST["Buchstabenfolge"]; 

$association = 'AND'; 

for($i=0;$i<strlen($var1);$i++){
 $arr[]=substr($var1,$i,1);
 }
  


$query = array(); 

foreach($arr as $key => $ar ) { 
    $query[] = "(   `wort`    LIKE '%".$ar."%' )"; 
} 

$query = implode("\n ".$association." ",$query); 


$sql = " 
    SELECT  wort 
    FROM   test 
    WHERE   ".$query." 
"; 

$res = mysql_query($sql); 

$out = array(); 

while ($row=mysql_fetch_assoc($res)) 
{ 
  $out[]= $row["wort"]; 
} 

print_r($out); 

?>
<br> 
<br> 
<br>
<br>
<br>
<pre>
     o O
    o  ___
   ||__|o|  ___________  _________   _____________
   |     |-\__Der Zug__/-\__löst__/-\_das Problem_/
   /OO-OO\   O       O     O   O      O         O

</pre>

</body>
</hmtl>

Und es funktioniert aber er spuckt bei muas noch wörter wie schauma aus ^^ deshalb begrenz ich das noch irgendwie danke für die hilfe ;)
 
Würde es nicht helfen wenn man schonmal eine Auswahl über die jeweilige Wortlänge trifft und so die Ergebnisliste eingrenzt.

Es macht ja nur Sinn wenn Wörter/Datensätze berücksichtigt werden die genauso lang sind wie der eingegebene Begriff. Dann würde auch kein "schauma" mehr geliefert und schneller könnte es auch sein.
 

Neue Beiträge

Zurück