PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Übersetzungs Script


theaims
28.06.2006, 19:13:46
Hallo

Also ich habe einen Übersetzer geschrieben. Dieser hat auch noch bis vor kurzem funktioniert. Jetzt habe ich aber das DB modell noch mal überdacht und rausgefunden das es unvorteillhaft ist. Zu viele spalten u.s.w.

So jetzt habe ich auch alles geändert. Neue DB abfrage alles verknüpft. Ich hoffe ihr könnt mir weiter helfen.

Also mein Problem ist ich möchte das alles in groß und klein schreibweise umgewandelt wird und das wörter die nicht in der db sind auch wieder so angezeigt werden wie ich sie im formular eingegeben habe.

Ich hoffe ihr könnt mir sagen wie ich das machen soll.

Und bitte erklärt es mir. Ich bin noch ein ziemlicher anfänger.



Mein Code:

<?php
$verbindung = mysql_connect ("localhost","root", "") or die ("keine Verbindung möglich. Benutzername oder Passwort sind falsch");
mysql_select_db("uebersetzer") or die ("Die Datenbank existiert nicht.");

if(!isset($_POST['submit']))
{
?>
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
Text: <textarea name="wort" ><? if(isset($_POST['wort'])){
echo($_POST['wort']); } ?></textarea>
Sprache:<select name="sprache">
<option value='de' selected="selected" >Englisch - Deutsch</option>
<option value='en'>Deutsch - Englisch</option>
</select>
<input type="submit" name="submit" value="Los" />
</form>
<?php
}
else
{
$sql = "SELECT wort FROM uebersetzer WHERE sprache = '".$_POST['sprache']."' AND ID = (SELECT ID FROM uebersetzer WHERE wort = '".$_POST['wort']."' AND sprache <> '".$_POST['sprache']."')";
$query = mysql_query($sql) or die(mysql_error());
if(mysql_num_rows($query) > 0)
{
$row = mysql_fetch_object($query);
echo $_POST['wort'].'<br />';
echo 'Die Übersetzung lautet: '.$row->wort;
}
else
echo 'Keine Übereinstimmung gefunden.';

}

Andes
29.06.2006, 13:37:53
Deine Angabe im ersten Teil, dass $_POST["wort"] im Formular ausgegeben wird dürfte nicht funktionieren. Da sich deine Bedingung für die Formularanzeige und die Wort-Anzeige gegenseitig ausschließen.
Formular soll angezeigt werden, wenn "submit" nicht existiert. Da aber "submit" und "wort" im selben Formular stehen. Kann "wort" ohne "submit" nicht existieren.

Soll nur ein einzelnes Wort übersetzt werden oder ganze Sätze? Was soll eigentlich die Abfrage im zweiten Teil bewirken?
Du gibst doch eh immer das Wort aus, welches im Formular geschrieben wurde. echo $_POST['wort'].'<br />';
Soll das ganze Wort oder nur der Anfangsbuchstabe groß oder klein geschrieben werden?

theaims
29.06.2006, 14:21:36
tja die übersetzung funtz ja so perfekt. also es geht alles. ich möchte nur das alles in klein schreibweise da stehen. und wörter die oben eingegeben sind und nicht in der db stehen unten auch so wieder rauskommen. also groß oder klein. für namen....

Andes
29.06.2006, 15:11:23
lies dies hier (http://www.selfphp.info/funktionsreferenz/string_funktionen/strtolower.php)
Mal nen Blick in die Funktionsreferenz werfen bewirkt manchmal Wunder.

theaims
29.06.2006, 15:36:38
ok. das habe ich jetzt.

und wie bekomme ich es hin das die wörter die oben stehen und nicht in der db sind auch unten wieder angezeigt werden?

und noch etwas kleines.....das formular verschwindet nach jedem absenden. woran liegt das?

Andes
29.06.2006, 15:52:55
Warum dein Formular verschwindet hatte ich dir oben schon geschrieben.
Du schreibst

if(!isset($_POST['submit'])) { }

Das heißt, dass dein Formular nur angezeigt werden soll, wenn die Variable nicht vorhanden ist. Durch das absenden ist sie aber vorhanden und somit wird deine Bedingung nicht mehr erfüllt. Lass einfach diese Bedingung weg und es wird immer angezeigt.

In dem du die Ausgabe des eingegebenen Wortes außerhalb deiner Bedingung schreibst.

echo $_POST['wort'].'<br />';
if(mysql_num_rows($query) > 0) {
$row = mysql_fetch_object($query);
echo 'Die Übersetzung lautet: '.$row->wort;
}
else echo 'Keine Übereinstimmung gefunden.';

theaims
29.06.2006, 16:31:27
Ok. Nur soll das wort nur wieder angezeigt werden wenn es nicht in der db vorhanden ist. Wie bekomme ich das hin? Weil jetzt wird beides angezeigt...

Andes
29.06.2006, 17:45:37
Dann setz die Ausgabe in else ein.


if(mysql_num_rows($query) > 0) {
$row = mysql_fetch_object($query);
echo 'Die Übersetzung lautet: '.$row->wort;
}
else echo 'Keine Übereinstimmung mit '.$_POST['wort'].' gefunden.';

theaims
29.06.2006, 18:03:10
Hmm ne das soll nicht extra da stehen. Dss soll dann zusammen mit dem anderen text stehen. Also:

Oben gebe ich "Hallo Test" ein. Hallo ist in der DB Test nicht. Hallo wird durch Hello ersetzt. Test wird nicht ersetzt weil nicht in der Db.

Unten soll dann "Hello Test" rauskommen. Das ist sehr wichtig für Namen und so.

Andes
29.06.2006, 19:13:49
Dann musst du halt deine Trefferausgabe vorher noch mals mit dem gesuchten Wörtern vergleichen. Bevor du sie endgültig ausgibst.

theaims
29.06.2006, 20:10:51
Äh ja sry ich bin noch php neuling. Ich kenne mich noch nicht so aus. Wie mache ich das?

Andes
29.06.2006, 21:52:51
Da für müsste man erst mal wissen wie deine Abfrage aussieht und ob du immer nur ein Wort oder mehrere Wörter suchst?
Aus deiner Select werde ich nicht ganz schlau. Mich würde es wundern, wenn die überhaupt was findet.
So wie du sie geschrieben hast muss entweder ein Wort oder ein String mit dem Wert im Feld "wort" übereinstimmen. Was soll die Unterabfrage auf "id"?
Warum muss einmal sprache = $sprache sein und kann aber in der Unterabfrage größer oder kleiner sein? Das hebt sich nach meinem Verständnis gegenseitig auf.

theaims
29.06.2006, 23:35:11
Ok wenn das stimmt was du sagst dürfte mein Script nicht funktionieren. Es funktioniert aber alles perfekt. Ich gebe im Formular das Wort ein er macht die DB abfrage und es wird unten wieder ausgegeben.

Vielleicht zum besseren verständnis beim DB Modell:

ID| wort | sprache
1 | Hallo | de
1 | Hello | en
1 | Salut | fr

Andes
30.06.2006, 00:06:21
So sieht aber nicht wirklich deine DB aus? Sieh besteht doch nicht nur aus diesen drei Spalten?
Dann erklär mir doch mal bitte deine Abfrage in Worten, da ich anscheinend die sql-syntax nicht verstehe.

Gut alles klar, du hast keinen Primärschlüssel auf id.
Sollen nun aber ein String abgefragt werden können oder nur ein Wort?

Logic
30.06.2006, 07:09:36
Hoffe ich jetzt auch nicht das dem so ist.

Empfehlung, 2 Tabellen:

tbl_sprache

id | sprache
1 | Deutsch
2 | Englisch
3 | Französisch

tbl_texte
id | index | sprach_id | text
1 | 1 | 1 |Hallo
2 | 1 | 2 | Hi
3 | 1 | 3 | Salut
4 | 2 | 1 | gut
5 | 2 | 2 | good

Die ID dient als Schlüssel, der Index zur spezifizierung welchen Text du willst, und die sprach_id in welcher Sprache die Ausgabe sein soll.

Gruss Logic

EDIT:
Korrekturen

theaims
30.06.2006, 12:52:31
So sieht aber nicht wirklich deine DB aus? Sieh besteht doch nicht nur aus diesen drei Spalten?
Dann erklär mir doch mal bitte deine Abfrage in Worten, da ich anscheinend die sql-syntax nicht verstehe.

Gut alles klar, du hast keinen Primärschlüssel auf id.
Sollen nun aber ein String abgefragt werden können oder nur ein Wort?


Ja es ist sind nur diese tabellen. Er soll halt recht einfach gehalten werden...

Ich merke es uach gerade. Er übersetzt mir immer nur ein wort. Wie schaffe ich es das er mir den ganzen string ersetzt?

Andes
30.06.2006, 13:36:26
In dem du die Leerzeichen bei einem String an deine Abfrage anpasst.
Das könnte z.Bsp. so aussehen.
Ob deine Abfrage dann noch funktioniert weiß ich allerdings nicht. Deine Ausgabe funktioniert bei einem String jeden falls nicht. Dafür müsstest du die gefunden Datensätze in einer Schleife ausgeben.


$string = "Hallo Test";
$sprache = "en";

$wort = preg_replace("/ /", "' and sprache <> '$sprache') or (wort = '", string);

$sql = "SELECT wort FROM uebersetzer WHERE sprache = '$sprache' AND ID = (SELECT ID FROM uebersetzer WHERE (wort = '$wort' AND sprache <> '$sprache'))";

//so sieht das mit den Werten aus
SELECT wort FROM uebersetzer WHERE sprache = 'en' AND ID = (SELECT ID FROM uebersetzer WHERE (wort = 'Hallo' and sprache <> 'en') or (wort = 'Test' AND sprache <> 'en'))

theaims
30.06.2006, 14:34:25
Ok. ich habe die ausgabe jetzt in eine schleife gepackt.
if(mysql_num_rows($query) > 0) {
while($row = mysql_fetch_object($query))
echo 'Die Übersetzung lautet: ' while($row->wort)
}

Parse error: parse error, unexpected T_WHILE, expecting ',' or ';' in.......

So nun mein zweites Problem. Ich habe deinen Code angepasst. Und mir die DB abfrage ausgeben lassen:

SELECT wort FROM uebersetzer WHERE sprache = '' AND ID = (SELECT id FROM uebersetzer WHERE (wort = 'string' AND sprache <> ''))

Warum steht da string? Müsste da nicht das passende wort stehen?

Hier sind die anderen zeilen:

$string = $_POST['wort'];
$sprache = $_POST['sprache'];

$wort = preg_replace("/ /", "' and sprache <> '$sprache') or (wort = '", string);

$sql = "SELECT wort FROM uebersetzer WHERE sprache = '$sprache' AND ID = (SELECT ID FROM uebersetzer WHERE (wort = '$wort' AND sprache <> '$sprache'))";
$query = mysql_query($sql) or die(mysql_error());
echo($sql);

Andes
30.06.2006, 15:07:25
Muss das nicht so heißen?

if(mysql_num_rows($query) > 0) {
while($row = mysql_fetch_object($query)) {
echo 'Die Übersetzung lautet: ' .$row->wort;
}
}


Ups, hatte $ in preg_replace bei string vergessen.
Das muss also so lauten.

$wort = preg_replace("/ /", "' and sprache <> '$sprache') or (wort = '", $string);

theaims
30.06.2006, 15:43:24
Ah und ich habe das nicht gefunden.

Ich hatte gerade die meldung:
Subquery returns more than 1 row

Da muss ich ja einfach nur mit ANY arbeiten.

Gut das läuft jetzt alles. Zwei Wörter gehen.

Nur er nimmt mir die leerzeichen dazwischen weg.

Also ich gebe oben "Hallo Ich" ein und unten kommt

"helloi" raus. Oder oben Hallo! das findet er auch nicht weil es so nicht in der db steht wie schaffe ich es das es getrennt wird?

Andes
30.06.2006, 15:57:08
Die Variable die bei preg_replace definiert wird, darf natürlich nicht wie dein Eingabefeld heißen.
Häng doch bei der Ausgabe einfach ein Leerzeichen an ($row->wort.' '). Dann sind die Wörter wieder getrennt.

theaims
30.06.2006, 16:03:22
Ne das mit der Augabe ist nicht so toll. Da kann ich ja wieder nur ein leerzeichen machen....

Also ich muss

$wort = preg_replace("/ /", "' and sprache <> '$sprache') or (wort = '", $string);

ändern damit mit das mit den Satzzeichen und dem Leerzeichen klappt?

Andes
30.06.2006, 20:59:00
Du sollst die Variable $wort anders nennen.
Die Satzzeichen musst du vor deiner Abfrage aus den Suchbegriffen entfernen. Sonst findest du ja keine Übereinstimmung.

theaims
30.06.2006, 21:04:41
Achja die Variable.

Und wie kann ich die entfernen? mit preg_split?

EDIT:

Ich verstehe das noch nicht so ganz mit den Variablen.

So schreibt er immer noch alles zusammen:

$string = $_POST['wort'];
$sprache = $_POST['sprache'];

$satz = preg_replace("/ /", "' and sprache <> '$sprache') or (wort = '", $string);

$sql = "SELECT wort FROM uebersetzer WHERE sprache = '$sprache' AND id = ANY (SELECT id FROM uebersetzer WHERE (wort = '$satz' AND sprache <> '$sprache'))";

Andes
30.06.2006, 23:34:00
Du kannst auch für preg_replace Arrays erstellen und diese einsetzen.

setlocale(LC_CTYPE, "de_DE"); //Dies in deinem Script notieren ansonsten werden dir auch alle Umlaute mit entfernt

$entf[0] = "/ /";
$einf[0] = "' and sprache <> '$sprache') or (wort = '", $string);
$entf[1] = "/\W/"; //entfernt alle Sonderzeichen aus deinem Satz
$einf[1] = ""; //Sonderzeichen durch nichts ersetzen

$satz = preg_replace($entf, $einf, $string);

Dieser Bereich hat aber nur etwas mit deiner Abfrage zu tun und nicht mit deiner Ausgabe.
Die Datensätze die du Ausgibst musst du natürlich so formatieren wie du sie benötigst. Ansonsten wird ja nur Datensatz für Datensatz ausgegeben. Und in diesen ist ja keine Satzformatierung enthalten. Bsp. Leerzeichen

Frage ich eine Tabelle ab, die nur Dezimalwerte enthält und gebe diese nicht Zeile für Zeile aus. Ergibt die Ausgabe nur Zahlensalat mit dem keiner was anfangen kann.

Bsp. 2 Datensätze gefunden

for($a=0; $a<$row; $a++)
{
echo mysql_result($sql, $a, "feld1");
}

Ausgabe:
1.253.45

for($a=0; $a<$row; $a++)
{
echo mysql_result($sql, $a, "feld1")."<br>";
}

Ausgabe:
1.25
3.45

Falls wir mit der Ausgabe an einander vorbei reden. Poste doch dein jetziges Script und schreib mal dazu wie die Ausgabe dann aussehen soll.

Ich hab aber mal ne andere Frage. Wenn du ganze Sätze so übersetzt, kommt doch in der Ausgabe kein vernünftiger Satz bei raus? Die Datensätze werden doch einfach ohne Sortierung ausgegeben. Auch, wenn du eine Sortierung angibst entspricht die ja nicht deinem eingegebenen Satz. Wie bewältigst du dann eine annähernd richtige Übersetzung?

theaims
01.07.2006, 00:12:17
Also ich glaube wir reden da ein wenig vorbei wie muss ich das denn formatieren?
Ich möchte das so haben das wenn oben ganze Sätze stehen die auch unten in ganzen Sätzen wieder raukommen. Und halt das er Satzeichen gesondert erkennt.
Das war es eigentlich schon. Was kann man denn da noch machen?

Mein Script:

<?php
$verbindung = mysql_connect ("localhost","root", "") or die ("keine Verbindung möglich. Benutzername oder Passwort sind falsch");
mysql_select_db("uebersetzer") or die ("Die Datenbank existiert nicht.");
?>
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
Text: <textarea name="wort" ><? if(isset($_POST['wort'])){
echo($_POST['wort']); } ?></textarea>
Sprache:<select name="sprache" >
<option value='de' >Englisch - Deutsch</option>
<option value='en' >Deutsch - Englisch</option>
</select>
<input type="submit" name="submit" value="Los" />
</form>
<?php
$string = $_POST['wort'];
$sprache = $_POST['sprache'];
$satz = preg_replace($entf, $einf, $string);
$wort = preg_replace("/ /", "' and sprache <> '$sprache') or (wort = '", $string);

setlocale(LC_CTYPE, "de_DE"); //Dies in deinem Script notieren ansonsten werden dir auch alle Umlaute mit entfernt

$entf[0] = "/ /";
$einf[0] = "' and sprache <> '$sprache') or (wort = '", $string);
$entf[1] = "/\W/"; //entfernt alle Sonderzeichen aus deinem Satz
$einf[1] = ""; //Sonderzeichen durch nichts ersetzen

$satz = preg_replace($entf, $einf, $string);

$sql = "SELECT wort FROM uebersetzer WHERE sprache = '$sprache' AND id = ANY (SELECT id FROM uebersetzer WHERE (wort = '$wort' AND sprache <> '$sprache'))";
$query = mysql_query($sql) or die(mysql_error());
if(mysql_num_rows($query) > 0) {
while($row = mysql_fetch_object($query)) {
echo $row->wort;
}
}

Für diese Zeile gibt er mir einen Fehler:

$einf[0] = "' and sprache <> '$sprache') or (wort = '", $string);

Parse error: parse error, unexpected ',' in.......

Und zu deiner anderen Frage. Also google macht ja auch nur eine 1 zu 1 übersetzung oder sehe ich das falsch? Naja sortiert sollte das garnicht werden oder bekommt man das so einfach hin? Ich denke mal nicht.....

Andes
01.07.2006, 01:00:55
Es ist halt schon etwas spät.

$einf[0] = "' and sprache <> '$sprache') or (wort = '";


Bei deinem Script muss aber schon viel eher eine Notiz über fehlende Variablen angezeigt werden.


$string = $_POST['wort'];
$sprache = $_POST['sprache'];
$satz = preg_replace($entf, $einf, $string); //Hier ist $entf und $einf noch nicht definiert, die Zeile kannst du löschen
$wort = preg_replace("/ /", "' and sprache <> '$sprache') or (wort = '", $string); //dies kannst du komplett aus deinem Script löschen, wenn du die Variante mit den Variablen benutzt

setlocale(LC_CTYPE, "de_DE"); //Dies in deinem Script notieren ansonsten werden dir auch alle Umlaute mit entfernt

$entf[0] = "/ /";
$einf[0] = "' and sprache <> '$sprache') or (wort = '";
$entf[1] = "/\W/"; //entfernt alle Sonderzeichen aus deinem Satz
$einf[1] = ""; //Sonderzeichen durch nichts ersetzen

$satz = preg_replace($entf, $einf, $string);


Mhm, hab mir ja noch nicht viele Seiten von Google übersetzen lassen. Aber ich denke mal schon, dass die etwas Sinn gemäß übersetzen und nicht eins zu eins. Kann mich aber auch täuschen.

Bei deiner Ausgabe fällt mir jetzt erst mal nur auf die Schnelle ein. Das du den eingegeben Satz (String) in ein Array wandelst. Die Treffer in der Datenbank schreibst du ebenfalls in ein Array und vergibst als Key das gesuchte Wort. Welches du halt mit auslesen müsstest. Dann liest du das Array der Eingabe in einer Schleife aus und fragst im Ausgabe-Array nach ob ein Key mit diesem Wort existiert. Wenn ja gibst du den Wert des Ausgabe-Arrays aus und, wenn nicht den Wert des Eingabe-Arrays.

Das könnte dann so aussehen.

Eingabe = „Hallo an alle in dieser Welt“

Eingabe-Array:

Array {
[0] = Hallo
[1] = an
[2] = alle
[3] = in
[4] = dieser
[5] = Welt
}

Ausgabe-Array:

Array {
[Hallo] = Hello
[Welt] = World
}

Abfrage:

Ist der Key Hallo in Ausgabe-Array enthalten, dann gib seinen Wert „Hello“ aus.
Ist er nicht enthalten, dann gib Hallo aus.

Damit erhältst du dann diesen Satz.

Hello an alle in dieser World

Allerdings würdest du mit einer DB in der jede Sprache ihre eigene Tabelle hat und die Wörter mit einer id verknüpft sind komfortablere Abfragen gestalten können.

theaims
01.07.2006, 11:48:14
Mit der Augabe werde ich sehen wenn das ganze Script erstmal läuft sprich ganze Sätze übersetzt werden können. Das tut es im momment immer noch nicht. Ab zwei Wörter übersetzt er garnichts mehr. Es kommt kein echo mehr. Noch nicht mal Helloi....

Könnte man es nicht in eine Schleife setzen, das er so lange sucht bis er alles hat?

Hier ist der aktuelle Code. Mit einem Wort geht alles.

$string = $_POST['wort'];
$sprache = $_POST['sprache'];

setlocale(LC_CTYPE, "de_DE"); //Dies in deinem Script notieren ansonsten werden dir auch alle Umlaute mit entfernt

$entf[0] = "/ /";
$einf[0] = "' and sprache <> '$sprache') or (wort = '";
$entf[1] = "/\W/"; //entfernt alle Sonderzeichen aus deinem Satz
$einf[1] = ""; //Sonderzeichen durch nichts ersetzen

$satz = preg_replace($entf, $einf, $string);

$sql = "SELECT wort FROM uebersetzer WHERE sprache = '$sprache' AND id = ANY (SELECT id FROM uebersetzer WHERE (wort = '$wort' AND sprache <> '$sprache'))";
$query = mysql_query($sql) or die(mysql_error());
if(mysql_num_rows($query) > 0) {
while($row = mysql_fetch_object($query)) {
echo $row->wort;

}
}

Andes
01.07.2006, 13:20:47
Das könntest du schon, bloß kann es auf die Performanz gehen. Auch, wenn er alle Wörter findet hast du dann immer noch das Problem, dass du mit dieser Abfrage nicht beide Wörter (original und übersetzt) ausgelesen bekommst. Die benötigst du aber um die Übersetzung in derselben Reihenfolge wie den gesuchten Satz ausgeben zu können.

Mit drei Tabellen fährst du um einiges besser. Ob du nun 3 Datensätze in einer oder einen in 3 Tabellen anlegst ist doch egal.

Ein Mal vor den Kopf klatsch. Er kann ja auch nichts finden. Durch preg_replace wird ja jedes Wort aneinander gereiht übergeben. Statt sie in die Bedingung zu wandeln. Ist auch klar warum. "\W" entfernt alle nicht alphanumerischen Zeichen und dazu gehört auch das Leerzeichen. Dazu kommt noch, dass die Sonderzeichen erst entfernt werden, wenn die Bedingung schon erstellt wurde. Die jetzige Anweisung macht folgendes.


Satz: Hallo, Test.

beim ersten Durchlauf sieht das noch so aus.

Hallo,' and sprache <> 'de') or (wort = 'Test.' and sprache <> 'de') or (wort = '

nach dem zweiten Durchlauf kommt dieses bei raus

HalloandsparachedeorwortTestandsprachedeorwort

Tausch mal den Bereich

$entf[0] = "/ /";
$einf[0] = "' and sprache <> '$sprache') or (wort = '";
$entf[1] = "/\W/"; //entfernt alle Sonderzeichen aus deinem Satz
$einf[1] = ""; //Sonderzeichen durch nichts ersetzen


mit dem hier


$entf[0] = "/\W/"; //entfernt alle Sonderzeichen aus deinem Satz, auch Leerzeichen
$einf[0] = " "; //setzt für alle entfernten Sonderzeichen ein Leerzeichen ein
$entf[1] = "/( ){2,}/"; //ersetzt alle doppelten Leerzeichen
$einf[1] = " "; //durch ein Leerzeichen
$entf[2] = "/( )$/"; //ersetzt ein Leerzeichen am Ende
$einf[2] = ""; //durch nichts
$entf[3] = "/ /"; //ersetzt alle Leerzeichen
$einf[3] = "' and sprache <> '$sprache') or (wort = '"; //mit diesem


In deinem Select muss dann auch $satz statt $wort eingesetzt werden.
Damit müsste es funktionieren.

theaims
05.07.2006, 21:45:28
Es kommt immer noch zusammen geschrieben raus.

Und kann ich so viele Leerzeichen zwischen den Wörter machen wie ich will?


<?php
$verbindung = mysql_connect ("localhost","root", "") or die ("keine Verbindung möglich. Benutzername oder Passwort sind falsch");
mysql_select_db("uebersetzer") or die ("Die Datenbank existiert nicht.");
?>
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
Text: <textarea name="wort" ><? if(isset($_POST['wort'])){
echo($_POST['wort']); } ?></textarea>
Sprache:<select name="sprache" >
<option value='de' >Englisch - Deutsch</option>
<option value='en' >Deutsch - Englisch</option>
</select>
<input type="submit" name="submit" value="Los" />
</form>
<?php
$string = $_POST['wort'];
$sprache = $_POST['sprache'];

setlocale(LC_CTYPE, "de_DE"); //Dies in deinem Script notieren ansonsten werden dir auch alle Umlaute mit entfernt

$entf[0] = "/\W/"; //entfernt alle Sonderzeichen aus deinem Satz, auch Leerzeichen
$einf[0] = " "; //setzt für alle entfernten Sonderzeichen ein Leerzeichen ein
$entf[1] = "/( ){2,}/"; //ersetzt alle doppelten Leerzeichen
$einf[1] = " "; //durch ein Leerzeichen
$entf[2] = "/( )$/"; //ersetzt ein Leerzeichen am Ende
$einf[2] = ""; //durch nichts
$entf[3] = "/ /"; //ersetzt alle Leerzeichen
$einf[3] = "' and sprache <> '$sprache') or (wort = '"; //mit diesem

$satz = preg_replace($entf, $einf, $string);

$sql = "SELECT wort FROM uebersetzer WHERE sprache = '$sprache' AND id = ANY (SELECT id FROM uebersetzer WHERE (wort = '$satz' AND sprache <> '$sprache'))";
$query = mysql_query($sql) or die(mysql_error());
if(mysql_num_rows($query) > 0) {
while($row = mysql_fetch_object($query)) {
echo $row->wort;

}
}

Andes
05.07.2006, 23:38:57
Dass immer noch alles zusammen geschrieben raus kommt, glaub ich ja nun nicht so richtig.

$string = "Hallo, an alle in dieser Welt!";
$sprache = "de";

setlocale(LC_CTYPE, "de_DE"); //Dies in deinem Script notieren ansonsten werden dir auch alle Umlaute mit entfernt

$entf[0] = "/\W/"; //entfernt alle Sonderzeichen aus deinem Satz, auch Leerzeichen
$einf[0] = " "; //setzt für alle entfernten Sonderzeichen ein Leerzeichen ein
$entf[1] = "/( ){2,}/"; //ersetzt alle doppelten Leerzeichen
$einf[1] = " "; //durch ein Leerzeichen
$entf[2] = "/( )$/"; //ersetzt ein Leerzeichen am Ende
$einf[2] = ""; //durch nichts
$entf[3] = "/ /"; //ersetzt alle Leerzeichen
$einf[3] = "' and sprache <> '$sprache') or (wort = '"; //mit diesem

print $satz = preg_replace($entf, $einf, $string);

so sieht dann die Ausgabe aus:
Hallo' and sprache <> 'de') or (wort = 'an' and sprache <> 'de') or (wort = 'alle' and sprache <> 'de') or (wort = 'in' and sprache <> 'de') or (wort = 'dieser' and sprache <> 'de') or (wort = 'Welt

Wenn du vor dem letzten Durchlauf mehr als ein Leerzeichen zwischen den Worten hast würde dir ($einf[3]) genau so oft eingesetzt werden wie Leerzeichen vorhanden sind.
Du musst nicht zwingend Leerzeichen nehmen. Ein anderes Zeichen machts auch. Es muss halt eindeutig sein.

theaims
06.07.2006, 12:14:42
Das gleiche kommt bei mir auch raus. Aber wenn ich halt alles in das formular feld eingebe kommt das raus:

Wenn ich Hallo Ich eingebe kommt unten

Hallo' and sprache <> 'en') or (wort = 'IchHelloi

raus. Wie schaffe ich es damit es richtig da steht?

Andes
06.07.2006, 16:34:56
Also warum das so ausgegeben wird, müsstest du eigentlich selbst wissen.

[Hallo' and sprache <> 'en') or (wort = 'Ich] Dieser Teil wird ausgegeben, weil du irgendwo die Variable $satz ausgibst. [Helloi] Warum dieser Teil zusammen geschrieben ist hab ich dir schon auf der ersten Seite erklärt.
Du musst natürlich bei deiner Ausgabe ein Leerzeichen einfügen.

while($row = mysql_fetch_object($query)) {
echo $row->wort;
}

//so zum Bsp.
while($row = mysql_fetch_object($query)) {
echo $row->wort." ";
}

Woher soll der Browser wissen, dass es zwei Worte sind. PHP gibt nur das aus was du angibst. Dass es für einen Browser verständlich ist, darum musst du dich schon selbst kümmern.

theaims
06.07.2006, 19:59:46
hm ich gebe es aber nicht aus.

und er beachtet jetzt die angabe der sprache nicht mehr. er zeigt beide wörter an deutsch und english

ab zwei oder mehr wörtern kommt dann das oben genannte.



$string = $_POST['wort'];
$sprache = $_POST['sprache'];

setlocale(LC_CTYPE, "de_DE"); //Dies in deinem Script notieren ansonsten werden dir auch alle Umlaute mit entfernt

$entf[0] = "/\W/"; //entfernt alle Sonderzeichen aus deinem Satz, auch Leerzeichen
$einf[0] = " "; //setzt für alle entfernten Sonderzeichen ein Leerzeichen ein
$entf[1] = "/( ){2,}/"; //ersetzt alle doppelten Leerzeichen
$einf[1] = " "; //durch ein Leerzeichen
$entf[2] = "/( )$/"; //ersetzt ein Leerzeichen am Ende
$einf[2] = ""; //durch nichts
$entf[3] = "/ /"; //ersetzt alle Leerzeichen
$einf[3] = "' and sprache <> '$sprache') or (wort = '"; //mit diesem

print $satz = preg_replace($entf, $einf, $string);

$sql = "SELECT wort FROM uebersetzer WHERE sprache = '$sprache' AND id = ANY (SELECT id FROM uebersetzer WHERE (wort = '$satz' AND sprache <> '$sprache'))";
$query = mysql_query($sql) or die(mysql_error());
if(mysql_num_rows($query) > 0) {
while($row = mysql_fetch_object($query)) {
echo $row->wort." ";
}
}

Andes
06.07.2006, 20:47:48
hm ich gebe es aber nicht aus.

Und was bedeutet deiner Meinung nach 'print' vor $satz = preg_replace.....?

theaims
06.07.2006, 22:12:43
achso ja. und äh er gibt die wörter so aus wie sie in der db stehen. wie bekomme ich das in das er die reihenfolge hat wie ich es eingebe?

und wie schaffe ich es das ich so viele leerzeichen machen kann wie ich will? momentan nimmt er nur eines. und satzzeichen nimmt er immer noch nicht. wenn ich oben ! ausgebe kommt unten nichts dafür raus.

Andes
06.07.2006, 22:39:42
Wie du deine Ausgabe steuern kannst hab ich dir hier schon mal erklärt.
http://www.selfphp.de/forum/showpost.php?p=84095&postcount=27
Musst dir halt was einfallen lassen wie du die Satzzeichen von den Wörtern getrennt bekommst. Damit sie als einzelner Wert im Array enthalten sind.

Mehre aufeinander folgende Leerzeichen kannst du mit geschützten Leerzeichen ausgeben oder du gibst deinen Text als Präformatierter Text (http://de.selfhtml.org/html/text/praeformatiert.htm) aus.

theaims
06.07.2006, 23:55:34
Also um die zeichen zu trennen etwas so?

$entf[4] = "!";
$einf[4] = "!";


Oder mit preg split?

Andes
07.07.2006, 00:53:07
Die Bearbeitung der Eingabe für ein Array muss gesondert erfolgen.
Dies könnte zum Bsp. so aussehen.



Eingabe: Das ist ein Satz, in dem Satz-Zeichen vorkommen.

//Eingabe für Array bearbeiten
$aentf[0] = "/(\W)/"; $aeinf[0] = " $1 "; //Allen Sonderzeichen ein Leerzeichen vor und nachstellen
$aentf[1] = "/( ){2,}/"; $aeinf[1] = " "; //Doppelte Leerzeichen auf eins reduzieren
$aentf[2] = "/( )$/"; $aeinf[2] = ""; //Leerzeichen am Satzende entfernen
$eing_string = preg_replace($aentf, $aeinf, $string);

Ergebnis: Das ist ein Satz , in dem Satz - Zeichen vorkommen .

//Überarbeitete Eingabe in Array zerlegen
$eing_array = explode(" ", $eing_string);

Array
(
[0] => Das
[1] => ist
[2] => ein
[3] => Satz
[4] => ,
[5] => in
[6] => dem
[7] => Satz
[8] => -
[9] => Zeichen
[10] => vorkommen
[11] => .
)


So wie du es schreibst
$entf[4] = "!";
$einf[4] = "!";
würdest du nur ein Ausrufezeichen gegen ein Ausrufezeichen ersetzen.

theaims
07.07.2006, 10:45:11
Brauche ich dann diesen Teil noch?

$entf[0] = "/\W/"; //entfernt alle Sonderzeichen aus deinem Satz, auch Leerzeichen
$einf[0] = " "; //setzt für alle entfernten Sonderzeichen ein Leerzeichen ein
$entf[1] = "/( ){2,}/"; //ersetzt alle doppelten Leerzeichen
$einf[1] = " "; //durch ein Leerzeichen
$entf[2] = "/( )$/"; //ersetzt ein Leerzeichen am Ende
$einf[2] = ""; //durch nichts
$entf[3] = "/ /"; //ersetzt alle Leerzeichen
$einf[3] = "' and sprache <> '$sprache') or (wort = '"; //mit diesem

Andes
07.07.2006, 11:28:52
Ja, na klar! Dieser Teil erstellt deine Bedingung für den Select.

theaims
07.07.2006, 16:59:19
Sorry aber ich verstehe noch nicht ganz wie ich das einbauen muss.

Nach der abfrage oder vor?

Andes
07.07.2006, 18:06:40
Du kannst es davor oder danach einbauen. Hauptsache es ist vorhanden, wenn du darauf zugreifen willst.

theaims
07.07.2006, 21:22:30
Okay ich habe es jetzt eingebaut und angepasst.

Nur es kommt keine ausgabe. Wie soll ich jetzt mit dem array weiter verfahren?

Ich habe es so gemacht. Ich habe es ohne das array ausgegeben. Ann klappt es. aber es werden alle satzzeichen entfernt:

$sql = "SELECT wort FROM uebersetzer WHERE sprache = '$sprache' AND id = ANY (SELECT id FROM uebersetzer WHERE (wort = '$satz' AND sprache <> '$sprache'))";
$query = mysql_query($sql) or die(mysql_error());
if(mysql_num_rows($query) > 0) {
while($row = mysql_fetch_object($query)) {


//Eingabe für Array bearbeiten
$aentf[0] = "/(\W)/"; $aeinf[0] = " $1 "; //Allen Sonderzeichen ein Leerzeichen vor und nachstellen
$aentf[1] = "/( ){2,}/"; $aeinf[1] = " "; //Doppelte Leerzeichen auf eins reduzieren
$aentf[2] = "/( )$/"; $aeinf[2] = ""; //Leerzeichen am Satzende entfernen

$eing_string = preg_replace($aentf, $aeinf, $row->wort);



//Überarbeitete Eingabe in Array zerlegen
$eing_array = explode(" ", $eing_string);

echo $eing_string." ";

}
}

Andes
07.07.2006, 22:15:59
Sorry, aber was ist das den für Blödsinn.
Du sollt doch nicht deine gefunden Datensätze umwandeln lassen. Sondern den Text der in das Eingabefeld eingegeben wurde. Das hatte ich doch schon alles so geschrieben. Du hättest den Teil nur Kopieren müssen.

Deshalb hast du auch keine Satzzeichen in dem String. Außer du hast welche in deiner Datenbank.

Lies dir Beitrag 27 noch mal richtig durch. Denn so hab ich das bestimmt nicht beschrieben.

theaims
08.07.2006, 10:23:35
Jetzt kommt wenigstens wieder eine ausgabe:

$string = $_POST['wort'];
$sprache = $_POST['sprache'];

//Eingabe für Array bearbeiten
$aentf[0] = "/(\W)/"; $aeinf[0] = " $1 "; //Allen Sonderzeichen ein Leerzeichen vor und nachstellen
$aentf[1] = "/( ){2,}/"; $aeinf[1] = " "; //Doppelte Leerzeichen auf eins reduzieren
$aentf[2] = "/( )$/"; $aeinf[2] = ""; //Leerzeichen am Satzende entfernen

$eing_string = preg_replace($aentf, $aeinf, $string);


setlocale(LC_CTYPE, "de_DE"); //Dies in deinem Script notieren ansonsten werden dir auch alle Umlaute mit entfernt

$entf[0] = "/\W/"; //entfernt alle Sonderzeichen aus deinem Satz, auch Leerzeichen
$einf[0] = " "; //setzt für alle entfernten Sonderzeichen ein Leerzeichen ein
$entf[1] = "/( ){2,}/"; //ersetzt alle doppelten Leerzeichen
$einf[1] = " "; //durch ein Leerzeichen
$entf[2] = "/( )$/"; //ersetzt ein Leerzeichen am Ende
$einf[2] = ""; //durch nichts
$entf[3] = "/ /"; //ersetzt alle Leerzeichen
$einf[3] = "' and sprache <> '$sprache') or (wort = '"; //mit diesem

$satz = preg_replace($entf, $einf, $eing_string);

Nur wie mache ich das jetzt wie du es in Beitrag 27 beschrieben hast?

mit foreach? Sorry da habe ich echt keine ahnung.

edit:

wie schaffe ich es das er auch doppelte wörter sucht? es kann ja auch mal zweimal ich in einem satz vorkommen.

Andes
08.07.2006, 18:13:07
Bei dem zweiten preg_replace gehört $string statt $eing_string.


Du kannst dafür foreach oder auch for-Schleife nehmen. Das bleibt dir überlassen.
http://www.selfphp.info/funktionsreferenz/array_funktionen/index.php

Du kannst auch die Eingabe so lassen wie sie ist und speicherst nur die Übersetzung und das gesuchte Wort jeweils in einem eigenen Array ab.
Dieses setzt du dann in preg_replace ein und lässt das gesuchte Wort mit dem übersetzten Wort ersetzen. Bei dieser Variante musst du aber aufpassen das dein Patern nur auf dieses eine Wort passt und nicht auf alles.
http://www.php-resource.de/tutorials/read/10/1/

theaims
10.07.2006, 14:53:08
Hmm das mit foreach habe ich noch nicht so ganz verstanden.

Wie muss ich das denn genau machen?

Etwa so?

foreach ($eing_string as $string){

Andes
10.07.2006, 17:54:24
Ja, aber bezeichne die Variable nicht $string, da sie schon existiert. Dürfte zwar hier nicht zu Problemen führen, aber man sollte sich gar nicht erst angewöhnen Variablen-Namen doppelt zu vergeben.

theaims
10.07.2006, 19:46:20
Ok.

Aber wie muss ich jetzt weiter verfahren?

Ich habe das jetzt so gemacht aber es kommt keine Augabe.

$string = $_POST['wort'];
$sprache = $_POST['sprache'];

//Eingabe für Array bearbeiten
$aentf[0] = "/(\W)/"; $aeinf[0] = " $1 "; //Allen Sonderzeichen ein Leerzeichen vor und nachstellen
$aentf[1] = "/( ){2,}/"; $aeinf[1] = " "; //Doppelte Leerzeichen auf eins reduzieren
$aentf[2] = "/( )$/"; $aeinf[2] = ""; //Leerzeichen am Satzende entfernen

$eing_string = preg_replace($aentf, $aeinf, $string);


foreach ($eing_string as $string2){
}


setlocale(LC_CTYPE, "de_DE"); //Dies in deinem Script notieren ansonsten werden dir auch alle Umlaute mit entfernt

$entf[0] = "/\W/"; //entfernt alle Sonderzeichen aus deinem Satz, auch Leerzeichen
$einf[0] = " "; //setzt für alle entfernten Sonderzeichen ein Leerzeichen ein
$entf[1] = "/( ){2,}/"; //ersetzt alle doppelten Leerzeichen
$einf[1] = " "; //durch ein Leerzeichen
$entf[2] = "/( )$/"; //ersetzt ein Leerzeichen am Ende
$einf[2] = ""; //durch nichts
$entf[3] = "/ /"; //ersetzt alle Leerzeichen
$einf[3] = "' and sprache <> '$sprache') or (wort = '"; //mit diesem

$satz = preg_replace($entf, $einf, $string2);


Muss ich noch etwas mit foreach machen?

Andes
10.07.2006, 21:02:32
Also ich empfehle dir dringend dich mit den Grundlagen von PHP aus einander zu setzten. Du greifst etwas zu sehr nach den Sternen, wenn du nicht mal weißt was eine Schleife ist.
Erst ein Mal ist die Schleife völlig deplatziert und zweitens versuchst du einen String in der Schleife zu übergeben. Was zu einer Warnung führt. Dann gehört auch ein Inhalt in die Schleife. Ansonsten ist sie völlig sinnlos.

Dein setlocale() gehört an den Anfang des Dokuments oder zumindest über das erste preg_replace(). Ansonsten werden dir dort die Umlaute mit entfernt.

Nun hab ich eh schon fast alles geschrieben. So sollte dein Script nun aussehen. Wie du nun aber das abgefragte Wort aus deiner Datenbank ausließt musst du selber wissen.

Dies wäre die Variante mit den Arrays

<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
Text: <textarea name="wort" ><? if(isset($_POST['wort'])) echo($_POST['wort']); ?></textarea>
Sprache:
<select name="sprache" size="1">
<option value='de' >Englisch - Deutsch</option>
<option value='en' >Deutsch - Englisch</option>
</select>
<input type="submit" name="submit" value="Los">
</form>

<?php
if(isset($_POST['wort'])) {
$string = $_POST['wort'];
$sprache = $_POST['sprache'];

setlocale(LC_CTYPE, "de_DE"); //Dies in deinem Script notieren ansonsten werden dir auch alle Umlaute mit entfernt

$entf[0] = "/\W/"; //entfernt alle Sonderzeichen aus deinem Satz, auch Leerzeichen
$einf[0] = " "; //setzt für alle entfernten Sonderzeichen ein Leerzeichen ein
$entf[1] = "/( ){2,}/"; //ersetzt alle doppelten Leerzeichen
$einf[1] = " "; //durch ein Leerzeichen
$entf[2] = "/( )$/"; //ersetzt ein Leerzeichen am Ende
$einf[2] = ""; //durch nichts
$entf[3] = "/ /"; //ersetzt alle Leerzeichen
$einf[3] = "' and sprache <> '$sprache') or (wort = '"; //mit diesem

$satz = preg_replace($entf, $einf, $string);

//Eingabe für Array bearbeiten
$aentf[0] = "/(\W)/"; $aeinf[0] = " $1 "; //Allen Sonderzeichen ein Leerzeichen vor und nachstellen
$aentf[1] = "/( ){2,}/"; $aeinf[1] = " "; //Doppelte Leerzeichen auf eins reduzieren
$aentf[2] = "/( )$/"; $aeinf[2] = ""; //Leerzeichen am Satzende entfernen
$eing_string = preg_replace($aentf, $aeinf, $string);

//Überarbeitete Eingabe in Array zerlegen
$eing_array = explode(" ", $eing_string);

$sql = "SELECT wort FROM uebersetzer WHERE sprache = '$sprache' AND id = ANY (SELECT id FROM uebersetzer WHERE (wort = '$satz' AND sprache <> '$sprache'))";
$query = mysql_query($sql) or die(mysql_error());
if(mysql_num_rows($query) > 0) {
while($row = mysql_fetch_object($query))
{
//Treffer in Array speichern
//abgefragtes_wort steht für das Feld mit dem abgefragten Wort
$ausg_array[$row->abgefragtes_wort] = $row->wort;

}
}

//Ausgabe mit Arrays
foreach($eing_array as $ausgabe)
{
//wenn Abgefragtes Wort als Key in DB-Treffere enthalten ist, übersetztes Wort ausgeben
if(array_key_exists($ausgabe, $ausg_array)) echo $ausg_array[$ausgabe]." ";
//sonst eingegebenes Wort
else echo $ausgabe." ";
}
}
?>


und dies mit preg_replace

<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
Text: <textarea name="wort" ><? if(isset($_POST['wort'])) echo($_POST['wort']); ?></textarea>
Sprache:
<select name="sprache" size="1">
<option value='de' >Englisch - Deutsch</option>
<option value='en' >Deutsch - Englisch</option>
</select>
<input type="submit" name="submit" value="Los">
</form>

<?php
if(isset($_POST['wort'])) {
$string = $_POST['wort'];
$sprache = $_POST['sprache'];

setlocale(LC_CTYPE, "de_DE"); //Dies in deinem Script notieren ansonsten werden dir auch alle Umlaute mit entfernt

$entf[0] = "/\W/"; //entfernt alle Sonderzeichen aus deinem Satz, auch Leerzeichen
$einf[0] = " "; //setzt für alle entfernten Sonderzeichen ein Leerzeichen ein
$entf[1] = "/( ){2,}/"; //ersetzt alle doppelten Leerzeichen
$einf[1] = " "; //durch ein Leerzeichen
$entf[2] = "/( )$/"; //ersetzt ein Leerzeichen am Ende
$einf[2] = ""; //durch nichts
$entf[3] = "/ /"; //ersetzt alle Leerzeichen
$einf[3] = "' and sprache <> '$sprache') or (wort = '"; //mit diesem

$satz = preg_replace($entf, $einf, $string);

$sql = "SELECT wort FROM uebersetzer WHERE sprache = '$sprache' AND id = ANY (SELECT id FROM uebersetzer WHERE (wort = '$satz' AND sprache <> '$sprache'))";
$query = mysql_query($sql) or die(mysql_error());
if(mysql_num_rows($query) > 0) {
$x = 0;
while($row = mysql_fetch_object($query))
{
//Treffer in Array speichern
//abgefragtes_wort steht für das Feld mit dem abgefragten Wort
$ausg_entf[$x] = "/".$row->abgefragtes_wort."/"; $ausg_einf[$x] = $row->wort;
$x++;
}
}

//Ausgabe mit preg_replace
//ersetze eingegebene Wörte mit übersetzten Wörtern
//musst halt schauen, dass du dein Patern so anpasst das es wirklich nur auf dieses eine Wort passt und nicht auf mehrere
echo preg_replace($ausg_entf, $ausg_einf, $string);
}
?>

theaims
10.07.2006, 21:37:10
Ok danke.

Ich finde das mit replace besser. Aber hast du mal einen Link wo das mit den pattern erklärt wird?

Weil ich habe es jetzt schon geschaft das ich eine ausgabe hinbekomme.

aber wenn ich oben Hallo! eingebe kommt unten

HelloHHelloaHellolHellolHellooHello!Hello raus.

Andes
10.07.2006, 21:45:39
siehe Beitrag 47

theaims
10.07.2006, 22:29:39
Ok

Ich habe das tut mal befolgt aber daraus wurde ich auch nicht viel schlauer.

Ich habe es mal eingebaut wie ich denke das es richtig ist. Aber da ist noch der wurm drinn. Es kommt immer die meldung:

Warning: preg_replace() [function.preg-replace]: Parameter mismatch, pattern is a string while replacement in an array.


So habe ich es jetzt mal probiert:

$ausg_entf[$x] = "/".$row->abgefragtes_wort."/"; $ausg_einf[$x] = $row->wort;
$x++;
}
}

//Ausgabe mit preg_replace
//ersetze eingegebene Wörte mit übersetzten Wörtern
//musst halt schauen, dass du dein Patern so anpasst das es wirklich nur auf dieses eine Wort passt und nicht auf mehrere
$pattern = "/\b".$ausg_entf."\b/ims";
$result = preg_replace($pattern, $ausg_entf, $ausg_einf, $string);

}

echo ($result);

Bitte nicht hauen wenn das jetzt völliger mist ist :)

Andes
10.07.2006, 22:47:52
preg_replace() hat nur drei Optionen und du gibst vier an. Zudem versuchst du ein Array in deine Suche zu quetschen. Was natürlich nicht geht. Musst dein Patern schon direkt bei den einzelnen Einträgen des Arrays $ausg_entf[$x] einfügen.

theaims
10.07.2006, 22:56:11
Also so?

$ausg_entf[$x] = "/".$row->abgefragtes_wort."/"; $ausg_einf[$x] = $row->wort; $ausg_entf[$x] = "/\b".$ausg_entf."\b/ims";
$x++;
}
}

So kommt aber unten nur wieder Hallo raus.

Muss da nicht etwas anderes als $ausg_entf stehen?

Andes
10.07.2006, 23:34:38
Muss da nicht etwas anderes als $ausg_entf stehen?

Also, wenn du dich das schon selbst fragst müsste dir ja die Lösung schon selbst auffallen.
Wenn dann bitte so:

$ausg_entf[$x] = "/\b".$row->abgefragtes_wort."\b/ims"; $ausg_einf[$x] = $row->wort;

theaims
11.07.2006, 14:09:06
Ok. Aber es kommt immer noch wenn ich Hallo! eingebe HelloHalloHello!

Woran liegt das jetzt noch? Ich habe doch jetzt ein pattern.

Und wenn ich jetzt Hallo eingebe und von English nach Deutsch wähle müsste ja eigentlich garnichts kommen aber es kommt das:

Warning: Wrong parameter count for preg_replace() in.....

Andes
11.07.2006, 17:38:44
Ok. Aber es kommt immer noch wenn ich Hallo! eingebe HelloHalloHello!
Das kann ich dir so nicht sagen, da ich nicht hellsehen kann.
Wenn du dein Script dazu einstellen würdest könnte man vielleicht was dazu sagen. Du scheinst das Script etwas merkwürdig zu verändern.
Was hat z.Bsp. echo ($result); zu bedeuten und wieso steht dies außerhalb der Klammern? Da dürfte PHP schon mal nicht mit einverstanden sein und dir entsprechende Meldungen ausgeben.

Warning: Wrong parameter count for preg_replace() in.....
Auch hier benötigt man das Script und auch die Komplette Meldung.
Ich nehme aber mal an, dass du versuchst irgendetwas zu übergeben wo mit PHP nicht einverstanden ist.

theaims
11.07.2006, 18:46:51
Ok hier das Script:

<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
Text: <textarea name="wort" ><? if(isset($_POST['wort'])){
echo($_POST['wort']); } ?></textarea>
Sprache:<select name="sprache" >
<option value='de' >Englisch - Deutsch</option>
<option value='en' >Deutsch - Englisch</option>
</select>
<input type="submit" name="submit" value="Los" />
</form>
<?php
if(isset($_POST['wort'])) {
$string = $_POST['wort'];
$sprache = $_POST['sprache'];

setlocale(LC_CTYPE, "de_DE");

$entf[0] = "/\W/"; //entfernt alle Sonderzeichen aus deinem Satz, auch Leerzeichen
$einf[0] = " "; //setzt für alle entfernten Sonderzeichen ein Leerzeichen ein
$entf[1] = "/( ){2,}/"; //ersetzt alle doppelten Leerzeichen
$einf[1] = " "; //durch ein Leerzeichen
$entf[2] = "/( )$/"; //ersetzt ein Leerzeichen am Ende
$einf[2] = ""; //durch nichts
$entf[3] = "/ /"; //ersetzt alle Leerzeichen
$einf[3] = "' and sprache <> '$sprache') or (wort = '"; //mit diesem

$satz = preg_replace($entf, $einf, $string);

$sql = "SELECT wort FROM uebersetzer WHERE sprache = '$sprache' AND id = ANY (SELECT id FROM uebersetzer WHERE (wort = '$satz' AND sprache <> '$sprache'))";
$query = mysql_query($sql) or die(mysql_error());
if(mysql_num_rows($query) > 0) {
$x = 0;
while($row = mysql_fetch_object($query))
{
//Treffer in Array speichern
//abgefragtes_wort steht für das Feld mit dem abgefragten Wort
$ausg_entf[$x] = "/\b".$row->abgefragtes_wort."\b/ims"; $ausg_einf[$x] = $row->wort;
$x++;
}
}

//Ausgabe mit preg_replace
//ersetze eingegebene Wörte mit übersetzten Wörtern
//musst halt schauen, dass du dein Patern so anpasst das es wirklich nur auf dieses eine Wort passt und nicht auf mehrere
echo preg_replace($ausg_entf, $ausg_einf, $string);
}

Andes
11.07.2006, 20:24:14
$ausg_entf[$x] = "/\b".$row->abgefragtes_wort."\b/ims"; $ausg_einf[$x] = $row->wort;
abgefragtes_wort steht nur als Platzhalter. Dafür musst du dann das Feld deiner Datenbank eintragen, in dem das abgefragte Wort enthalten ist.

Die Zeile müsste mit Werten dann so aussehen.

$ausg_entf[0] = "/\bHallo\b/ims"; ausg_einf[0] = "Hello";
Damit das auch so erstellt werden kann, musst du deine Datenbank-Abfrage so umgestalten, dass du beide Wörter als Ausgabe erhältst und nicht nur das übersetzte Wort.

theaims
11.07.2006, 20:41:53
Aber wenn ich die ausgabe ändere das beide wörter ausgegeben werden kann ich sie ja nicht mehr an der id erkennen kann? oder ist das völliger quatsch? oder muss ich eine zweite abfrage machen?

Andes
11.07.2006, 21:40:21
Das hab ich dir ja schon mal geschrieben, dass du mit drei Tabellen besser kommst.

theaims
11.07.2006, 21:48:55
Aber bekomme ich das so nicht hin? Und wenn ja wie?

Andes
11.07.2006, 21:55:57
Also für mich endet es hier. Auf irgendwas musst du schon mal selber kommen. Foren sind nicht dafür da, einem PHP und MySql zu lernen. Das musst du schon in einem gewissen Maße selbst mitbringen.

theaims
11.07.2006, 23:14:35
Aber ich habe doch gar keinen ansatz. Und das steht auch in keinem tut....

Andes
11.07.2006, 23:24:54
Du kannst dich ja mal mit dem hier beschäftigen. Vielleicht hast du dann ja einen Ansatz.
http://dev.mysql.com/doc/refman/4.0/de/join.html
Musst etwas scrollen. Der Inhalt wird komischer weise unten angezeigt.

theaims
12.07.2006, 12:36:50
Ok mit join das war mir klar nur wie bekomme ich jetzt dieses eine wort daraus? Mit der id geht das ja nicht.

Oder könnte ich es auch so machen?

Ich definiere oben eine neue Variable:

$string1 = $_POST['wort'];


Und unten mache ich das dann so:

ausg_entf[$x] = "/\b".$row->$string1."\b/ims"; $ausg_einf[$x] = $row->wort;
$x++;
}
}



Dann gibt er mir allerdings das Wort wieder dreimal aus:

HelloHalloHello

Andes
12.07.2006, 15:56:49
Wenn du das mal mit einem Satz versucht hättest, wäre dir aufgefallen. Das in jeder Zeile deines $ausg_entf[] Array der eingegebene Satz enthalten ist.
Mal davon abgesehen, dass dies völliger Blödsinn ist. Muss das zu ersetzende Wort aus deiner Datenbank stammen. Ansonsten hast du keinen Bezug zu dem übersetzten Wort.
Wie ich dir ja schon sagte, wirst du dies auch mit deiner jetzigen Tabellenstruktur nicht hin bekommen. Um einen Bezug zwischen abgefragtem Wort (Hallo) und dem übersetzten Wort (Hello) zu bekommen muss deine Trefferausgabe in einer Zeile stehen. Bei dir würden aber mehrere Zeilen mit je einem Wort ausgegeben.

So müsste es sein Treffer(Hallo, Hello) und bei dir wäre es dann so
Treffer(
Hallo
Hello
)
Das mag zwar so noch bei einem einzelnen Wort funktionieren. Aber bei einem kompletten Satz würden dir die einzelnen Worte zusammenhangslos ausgegeben. Du könntest zwar nun noch die jeweilige ID des Worts ausgeben und dann abfragen welche Worte die gleiche ID besitzen. Aber das wäre zu umständlich.


Am einfachsten kannst du es so machen.

Erstelle folgende Tabelle. In dieser hat jede Sprache eine Spalte.

id | wort_de | wort_en | wort_fr

id = Primary-Key mit auto_increment

Dann kannst du mit diesem Script es so bewältige, dass dir am Ende der eingegebene Satz mit den Übersetzten Wörtern ausgegeben wird.


<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
Text: <textarea name="wort" ><? if(isset($_POST['wort'])) echo($_POST['wort']); ?></textarea>
Sprache:
<select name="sprache" size="1">
<option value="en|de">Englisch - Deutsch</option>
<option value="de|en">Deutsch - Englisch</option>
</select>
<input type="submit" name="submit" value="Los">
</form>

<?php
if(isset($_POST['wort'])) {
$string = $_POST['wort'];
$sprache = $_POST['sprache'];

//Ausgewählte Übersezung, String teilen
$sprache_array = explode("|", $sprache);
//Wort, von der Sprache
$wort_von = $sprache_array[0];
//in die Sprache übersetzt werden soll
$wort_in = $sprache_array[1];

setlocale(LC_CTYPE, "de_DE"); //Dies in deinem Script notieren ansonsten werden dir auch alle Umlaute mit entfernt

$entf[0] = "/\W/"; //entfernt alle Sonderzeichen aus deinem Satz, auch Leerzeichen
$einf[0] = " "; //setzt für alle entfernten Sonderzeichen ein Leerzeichen ein
$entf[1] = "/( ){2,}/"; //ersetzt alle doppelten Leerzeichen
$einf[1] = " "; //durch ein Leerzeichen
$entf[2] = "/( )$/"; //ersetzt ein Leerzeichen am Ende
$einf[2] = ""; //durch nichts
$entf[3] = "/ /"; //ersetzt alle Leerzeichen
$einf[3] = "' or wort_".$wort_von." like '"; //mit diesem

$satz = preg_replace($entf, $einf, $string);

$sql = "SELECT wort_".$wort_von." as entfernen, wort_".$wort_in." as einfügen FROM uebersetzer WHERE wort_".$wort_von." like '$satz'";
$query = mysql_query($sql) or die(mysql_error());
if(mysql_num_rows($query) > 0) {
while($row = mysql_fetch_object($query))
{
//Treffer in Array speichern
//abgefragtes_wort steht für das Feld mit dem abgefragten Wort
$ausg_entf[] = "/\b".$row->entfernen."\b/"; $ausg_einf[] = $row->einfügen;
}

//Ausgabe mit preg_replace
//ersetze eingegebene Wörte mit übersetzten Wörtern
echo preg_replace($ausg_entf, $ausg_einf, $string);
}
else {
echo "Keine Übereinstimmung gefunden!<br>";
echo $string;
}
}

theaims
12.07.2006, 16:11:37
Ok ich habe jetzt eingesehen das es mit den tabellen nicht ging....

Aber ich habe deinen Code jetzt probiert und es erfolgt keine ausgabe.

Tabellen habe ich erstellt und gefüllt auch.

Ich habe mir gerade die Query ausgeben lassen und da kommt das hier raus:

SELECT wort_de as entfernen, wort_en as einfügen FROM uebersetzer WHERE wort_de like 'Hallo'

Andes
12.07.2006, 16:23:12
Hast du dies mal bei phpmyadmin eingegeben? Dann müsste dir eigentlich auch etwas ausgegeben werden.

theaims
12.07.2006, 16:43:30
Ja habe ich hier:

id wort_de wort_en
1 hallo hello

Jetzt kommt ja etwas raus. Hallo kommt wieder raus. Und es kommt ja auch nichtkeine übereinstimmung gefunden aber er müsste doch hello ausgeben oder?

Wenn ich den selct befehl eingebe kommt das raus:

entfernen einfügen
hallo hello

Andes
12.07.2006, 17:14:01
Eigentlich müsste es dir 'Hello' ausgeben. Bei mir tut es dies auch.
Nach dem ja die Abfrage stimmt und auch ein entsprechendes Ergebnis liefert.
Muss etwas in der while-Schleife oder bei preg_replace schief laufen.

Edit:
Wie ich gerade sehe, ist bei dir hallo und nicht Hallo in der Tabelle eingetragen. Bei der Abfrage wird Groß- und Kleinschreibung nicht berücksichtigt aber bei dem Partnern schon.

Dann setzt mal noch ein 'i' nach den Delimiter, dann wird auch da die Groß-/Kleinschreibung ignoriert.

Das muss dann so ausehen.

$ausg_entf[] = "/\b".$row->entfernen."\b/i"; $ausg_einf[] = $row->einfügen;

theaims
12.07.2006, 17:51:13
Oh es war nur ein kleines i.

Jetzt funtzt er ohne Probleme!

Danke das du mir hier so geholfen hast. Danke! Danke! Danke!