Ankündigung

Einklappen
Keine Ankündigung bisher.

Probleme mit Regex - bekannten Satz in Text wiederfinden

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Probleme mit Regex - bekannten Satz in Text wiederfinden

    Hallo liebes Forum,

    ich habe mir an einem Problem die Zähne ausgebissen und weiß momentan leider nicht weiter. Es handelt sich um folgendes Problem:

    Ich habe einen Text, der aus z.B. 20 Sätzen und einigen sonstigem Inhalt wie HTML Code oder javascript besteht. Dieser Text wird in der Variable $content gespeichert. Daraufhin unterteile ich den text in Sätze (mittels Regex). Die einzelnen Sätze sind dann im Array $sentences gespeichert.

    Nun soll jeder Satz so aufbereitet werden, dass vor und nach dem jeweiligen Satz eine Markierung eingefügt wird, z.B. am anfang \\satz1\\ und //satz1//.
    Diese aufbereiteten Sätze werden im array $replacements gespeichert. Bis hierhin funktioniert mein skript.

    Nun aber möchte ich alle Sätze, die in $content gefunden wurden, durch die aufbereiteten sätze ersetzen. Das versuche ich über preg_replace($sentences, $replacements, $content). Das funktioniert aber leider nicht. Irgendwas läuft hier schief.

    Ich habe auch schon versucht, anstatt mit obiger preg_replace-Anweisung mit preg_replace($patterns, $replacements, $content) zu arbeiten, wobei im Array $patterns nun die Sätze stehen und ihnen vorn und hinten ein delimiter "/" angefügt ist. Aber auch das funktioniert nicht.

    Kann mir jmd weiterhelfen?

    Hier ist mein Code im Orginal:

    PHP-Code:
    $content file_get_contents($url);
    $sentences preg_split('/\. /'$content);        // Match auf einen Punkt gefolgt von Leerzeichen

    for($x    =0$x count($sentences); $x++) {
        
    $sentences[$x] = $sentences[$x] . ". ";        // -> Punkt wieder an Satzende anhängen
    }        

    // Replacements erzeugen
    $replacements = array();
    for(
    $x    =0$x count($sentences); $x++) {
        
    $replacements[$x] = "--text" $x "--" $sentences[$x] . "---text" $x "---";
    }

    // Suchmuster erzeugen
    $patterns = array();
    for(
    $x 0$x count($sentences); $x++) {
            
    $patterns[$x] = "/".$sentences[$x]."/";
    }

    // replacements in Dateiinhalt einspielen
    $content preg_replace($patterns$replacements$content); 
    Kann mir jmd helfen, das Problem zu lösen? Irgendwie komme ich hier nicht weiter.

    Vielen Dank.

    Grüße, Tobi


  • #2
    Willkommen im Forum.

    Kannst du nicht einfach $content = implode($replacements); schreiben?

    Poste im Zweifel mal ein komplettes Beispiel (mit Eingaben und erwarteter Ausgabe), damit man sieht, was das werden soll.

    Kommentar


    • #3
      Du musst die Sätzen escapen wenn du sie als Regulärenausdruck verwendest.
      http://php.net/manual/de/function.preg-quote.php

      Kommentar


      • #4
        // Match auf einen Punkt gefolgt von Leerzeichen
        Nicht sehr Zuverlässig. Z.B. hier.

        und einigen sonstigem Inhalt wie HTML Code
        Und was machste, wenn das Markup satzübergreifend angelegt ist?
        --

        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


        --

        Kommentar


        • #5
          Hallo,

          zunächst vielen Dank für Eure schnellen Antworten!

          Ich versuche einmal, das Problem etwas genauer zu beschreiben. Es geht eigentlich um folgendes:

          Ich möchte aus einem Dokument (txt, html, xml) versuchen, Sätze zu extrahieren, die dann in einem nächsten Schritt in eine Fremdsprache übersetzt werden sollen. Nach der Übersetzung sollen die übersetzten Sätze wieder an die entsprechende Stelle im Dokument eingefügt werden (um das Dateiformat, z.B. html, zu erhalten).
          Aus diesem Grund möchte ich alle Sätze im Ausgangsdokument mit einer eindeutigen Markierung versehen (inkl. Nummerierung), um nach der erfolgten Übersetzung die entsprechend markierten Sätze durch den übersetzten Satz zu ersetzen.

          Mein hier gepostetes Problem bezieht sich auf den ersten Teil des Problems. Ich bekomme die Sätze zwar extrahiert, jedoch bekomme ich die "aufbereiteten" (mit einer Markierung versehenen) Sätze nicht wieder zurück in das Dokument, weil preg_replace($sentences, $replacements, $content) nicht auf die $sentences im $content matcht. Das ist glaube ich das eigentliche Problem.

          Ich poste gleich mal ein komplettes Beispiel, dann könnt ihr euch einen besseren Eindruck verschaffen...

          Vielen Dank schonmal!

          Gruß, Tobi

          Kommentar


          • #6
            Hier mal ein Beispieltext aus einer txt datei:

            Code:
            MIME steht für Multipurpose Internet Mail Extensions. Aus dem Namen geht hervor, dass das, was da spezifiziert wird, ursprünglich für E-Mails gedacht war - und zwar für E-Mails mit Attachments (englisch für Anhang). Solche so genannten Multipart-Mails enthalten die gesamten zu übertragenden Daten in einer Datei. Innerhalb der Datei musste eine Konvention gefunden werden, wie die einzelnen Teile (z.B. Text der E-Mail und angehängte ZIP-Datei) voneinander zu trennen seien. Dabei wurde auch ein Schema entwickelt, das der interpretierenden Software mitteilt, um welchen Datentyp es sich bei dem jeweils nächsten Teil der E-Mail handelt.
            
            Das Schema erwies sich nicht nur für E-Mails als nützlich. Fast immer, wenn entfernte Programme (z.B. Web-Browser und Web-Server) wegen einer bevorstehenden Datenübertragung miteinander kommunizieren, geht es auch um die Art der zu übertragenden Daten. Dabei hat sich im gesamten Internet das Schema der MIME-Typen durchgesetzt. Auch im Web stößt man an verschiedenen Stellen auf MIME-Typen:
            
                Verschiedene HTML-Elemente haben Attribute, die als Wertzuweisung die Angabe eines MIME-Typen erwarten, nämlich Seite a (type), Seite form (accept und enctype), Seite input (accept), Seite link (type, Seite object (codetype und type), Seite param (type), Seite script (type) und Seite style (type).
                Wenn ein CGI-Script an den aufrufenden Browser einen Seite HTTP-Header sendet, muss es den MIME-Typ der nachfolgenden Daten senden.
            Diese Datei lade ich über ein html Formular hoch und extrahiere dann mit meinem oben geposteten Code den Text.

            Damit erhalte ich für $sentences folgende Ausgabe (wie erwartet). Jeden Satz lasse ich mir in einem neuen Zeile anzeigen:
            Code:
            MIME steht für Multipurpose Internet Mail Extensions.
            Aus dem Namen geht hervor, dass das, was da spezifiziert wird, ursprünglich für E-Mails gedacht war - und zwar für E-Mails mit Attachments (englisch für Anhang).
            Solche so genannten Multipart-Mails enthalten die gesamten zu übertragenden Daten in einer Datei.
            Innerhalb der Datei musste eine Konvention gefunden werden, wie die einzelnen Teile (z.B.
            Text der E-Mail und angehängte ZIP-Datei) voneinander zu trennen seien.
            Dabei wurde auch ein Schema entwickelt, das der interpretierenden Software mitteilt, um welchen Datentyp es sich bei dem jeweils nächsten Teil der E-Mail handelt. Das Schema erwies sich nicht nur für E-Mails als nützlich.
            Fast immer, wenn entfernte Programme (z.B.
            Web-Browser und Web-Server) wegen einer bevorstehenden Datenübertragung miteinander kommunizieren, geht es auch um die Art der zu übertragenden Daten.
            Dabei hat sich im gesamten Internet das Schema der MIME-Typen durchgesetzt.
            Auch im Web stößt man an verschiedenen Stellen auf MIME-Typen: Verschiedene HTML-Elemente haben Attribute, die als Wertzuweisung die Angabe eines MIME-Typen erwarten, nämlich Seite a (type), Seite form (accept und enctype), Seite input (accept), Seite link (type, Seite object (codetype und type), Seite param (type), Seite script (type) und Seite style (type). Wenn ein CGI-Script an den aufrufenden Browser einen Seite HTTP-Header sendet, muss es den MIME-Typ der nachfolgenden Daten senden. .
            Für $replacements erhalte ich folgende ausgabe (wie erwartet):
            Code:
            --text0--MIME steht für Multipurpose Internet Mail Extensions. ---text0---
            --text1--Aus dem Namen geht hervor, dass das, was da spezifiziert wird, ursprünglich für E-Mails gedacht war - und zwar für E-Mails mit Attachments (englisch für Anhang). ---text1---
            --text2--Solche so genannten Multipart-Mails enthalten die gesamten zu übertragenden Daten in einer Datei. ---text2---
            --text3--Innerhalb der Datei musste eine Konvention gefunden werden, wie die einzelnen Teile (z.B. ---text3---
            --text4--Text der E-Mail und angehängte ZIP-Datei) voneinander zu trennen seien. ---text4---
            --text5--Dabei wurde auch ein Schema entwickelt, das der interpretierenden Software mitteilt, um welchen Datentyp es sich bei dem jeweils nächsten Teil der E-Mail handelt. Das Schema erwies sich nicht nur für E-Mails als nützlich. ---text5---
            --text6--Fast immer, wenn entfernte Programme (z.B. ---text6---
            --text7--Web-Browser und Web-Server) wegen einer bevorstehenden Datenübertragung miteinander kommunizieren, geht es auch um die Art der zu übertragenden Daten. ---text7---
            --text8--Dabei hat sich im gesamten Internet das Schema der MIME-Typen durchgesetzt. ---text8---
            --text9--Auch im Web stößt man an verschiedenen Stellen auf MIME-Typen: Verschiedene HTML-Elemente haben Attribute, die als Wertzuweisung die Angabe eines MIME-Typen erwarten, nämlich Seite a (type), Seite form (accept und enctype), Seite input (accept), Seite link (type, Seite object (codetype und type), Seite param (type), Seite script (type) und Seite style (type). Wenn ein CGI-Script an den aufrufenden Browser einen Seite HTTP-Header sendet, muss es den MIME-Typ der nachfolgenden Daten senden. . ---text9---
            und wenn ich nun mit

            PHP-Code:
            $content preg_replace($sentences$replacements$content); 
            versuche, die Sätze im Orginal durch die aufbereiteten Sätze zu ersetzen, bekomme ich keine ausgabe für content.

            Kommentar


            • #7
              Zitat von mermshaus Beitrag anzeigen
              Willkommen im Forum.

              Kannst du nicht einfach $content = implode($replacements); schreiben?

              Poste im Zweifel mal ein komplettes Beispiel (mit Eingaben und erwarteter Ausgabe), damit man sieht, was das werden soll.
              @mermshaus: Ja, das würde bei txt Dateien im Prinzip gehen. Aber bei hmtl oder xml dateien nicht, weil hier auszeichnungen zwischen, vor oder nach den einzelnen sätzen stehen und diese Informationen dann beim "zusammenfügen" verloren gehen würden.

              Kommentar


              • #8
                Wobei es jetzt auch nicht so ist, dass dein aktueller Ansatz das in irgendeiner Weise berücksichtigen würde.

                Warum übersetzt du eigentlich nicht gleich? Warum dieser Zwischenschritt?

                Du solltest bei XML/HTML aber ohnehin einen DOM-Parser nutzen (DOMDocument) und etwa über alle Text-Nodes iterieren. Das mag auf den ersten Blick komplizierter wirken, aber mit dem Regex-Ansatz wirst du dich vor Problemen und Sonderfällen nicht mehr retten können. Anders gesagt: Du brauchst verschiedene Eingabe-Parser für verschiedene Eingabe-Formate.

                Kommentar


                • #9
                  Zitat von mermshaus Beitrag anzeigen
                  Wobei es jetzt auch nicht so ist, dass dein aktueller Ansatz das in irgendeiner Weise berücksichtigen würde.

                  Warum übersetzt du eigentlich nicht gleich? Warum dieser Zwischenschritt?

                  Du solltest bei XML/HTML aber ohnehin einen DOM-Parser nutzen (DOMDocument) und etwa über alle Text-Nodes iterieren. Das mag auf den ersten Blick komplizierter wirken, aber mit dem Regex-Ansatz wirst du dich vor Problemen und Sonderfällen nicht mehr retten können. Anders gesagt: Du brauchst verschiedene Eingabe-Parser für verschiedene Eingabe-Formate.
                  @mermshaus: Weil jeder Satz als Übersetzung in einer Datenbank gespeichert werden soll, um für weitere Übersetzungen als Übersetzungshilfe verfügbar zu sein...

                  Könntest Du mir das mit dem DOM-Parser etwas genauer erklären? Davon habe ich bislang nicht gehört. Was meinst Du damit?

                  Danke für Deine Hilfe!

                  Gruß, Tobi

                  Kommentar


                  • #10
                    Ehrlich gesagt bezweifle ich, dass das geht. Übersetzungen ändern oftmal die Reihenfolge der Wörter und Wortgruppen und wenn Du dann Inline-Markup hast, müsste das ja mit umgestellt, ggf. aufgeteilt etc. werden.
                    --

                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                    --

                    Kommentar


                    • #11
                      Zitat von nikosch Beitrag anzeigen
                      Ehrlich gesagt bezweifle ich, dass das geht. Übersetzungen ändern oftmal die Reihenfolge der Wörter und Wortgruppen und wenn Du dann Inline-Markup hast, müsste das ja mit umgestellt, ggf. aufgeteilt etc. werden.
                      Der Einwand mit dem Inline-Markup ist berechtigt. Allerdings übernimmt das der Übersetzer selbst und muss nicht vom Parser erledigt werden.

                      Der jeweilige Übersetzer kümmert sich darum, dass das inline markup wie a-tags o.ä. an die richtige stelle kommt. Mit ein bisschen Javascript lässt sich das grafisch ganz nett aufbereiten, dieses Problem habe ich bereits gelöst...

                      Kommentar


                      • #12
                        Mit Verlaub - das bezweifle ich stark. Und klar hat das Relevanz für den Parser, wenn Du Markup erhalten willst. Ansonsten frage ich mich worüber wir hier reden.
                        --

                        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                        --

                        Kommentar


                        • #13
                          Wie gesagt, die inside markups von Sätzen sind nicht das Problem. Der Nutzer/Übersetzer löscht sie manuel raus, markiert mit der Maus Wörter, die in der Übersetzung markups enthalten sollen, klickt den entsprechenden Button, z.B. für einen b-Tag, und das b-Tag wird vor und hinter dem entsprechend mit der Maus markierten Wort gesetzt.

                          Das Problem über das wir hier reden habe ich glaube ich mehrfach versucht zu erklären. Warum matcht meine preg_replace Funktion nicht auf die $sentences, obwohl diese doch explizit in $content drinstehen...

                          Wäre sehr dankbar für eine Hilfestellung an dieser Stelle...

                          Gruß, Tobi

                          Kommentar


                          • #14
                            Zitat von mermshaus Beitrag anzeigen
                            Wobei es jetzt auch nicht so ist, dass dein aktueller Ansatz das in irgendeiner Weise berücksichtigen würde.

                            Warum übersetzt du eigentlich nicht gleich? Warum dieser Zwischenschritt?

                            Du solltest bei XML/HTML aber ohnehin einen DOM-Parser nutzen (DOMDocument) und etwa über alle Text-Nodes iterieren. Das mag auf den ersten Blick komplizierter wirken, aber mit dem Regex-Ansatz wirst du dich vor Problemen und Sonderfällen nicht mehr retten können. Anders gesagt: Du brauchst verschiedene Eingabe-Parser für verschiedene Eingabe-Formate.
                            @mermshaus: Habe mich inzwischen ein bisschen schlau gemacht. In der Tat, Du hast Recht, so könnte es auch gehen, auch wenn bei dieser Lösung auch einige Ausnahmen auftreten können, so sind es doch weniger als über die regex Methode. Also setze ich mich mal ran und versuche dem ganzen über DOM ein wenig näher zu kommen. Danke für den Tipp!

                            Kommentar

                            Lädt...
                            X