preg_match: Einzahl/Mehrzahl berücksichtigen

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

  • preg_match: Einzahl/Mehrzahl berücksichtigen

    Hallo zusammen,

    folgenden Code nutze ich, um Datenbankinhalte in ein Array einzulesen, anschließend vorhandenen Content und Datenbankinhalte mittels preg_match auf Übereinstimmung zu untersuchen. Bei Übereinstimmung gibt's ein preg_replace.

    Dantenbank-Inhalte (Lexikon)
    1. ID ($g_id)
    2. Wort ($g_word)
    3. Bedeutung/Erläuterung


    PHP-Code:
    $inhalt "<zu durchsuchender Original-Content>";
    while(
    datenbank [g_wordg_idauslesen und in array packen
    {
    $suche_str "/\b".$g_word."(en|n)\b/i\n";
    $ersetze_str "<a href='glossar.php?id=$g_id'>$g_word</a>";

    if (
    preg_match($suche_str$inhalt))
        {
    $inhalt preg_replace($suche_str$ersetze_str$inhalt);
        }

    Bei den Fundstellen in $inhalt sollen Begriffe sowohl in Einzahl als auch Mehrzahl berücksichtigt werden, wobei in der Datenbank aus Platzgründen natürlich nur ein Begriff von beiden stehen soll - günstigstenfalls nur in der Einzahl.

    Bsp also.:
    DB Inhalt: Krone
    Funstelle: Krone oder Kronen.
    preg_match soll individuell ersetzen
    <a href='glossar.php....>Krone</a> ODER <a href='glossar.php....>Kronen</a>

    Die Fundstellen werden bei den Patterns in $suche_str zwar wie gewollt berücksichtigt, jedoch wird die Fundstelle derzeit logischerweise durch preg_replace mit dem Link per DB Inhalt ($g_word) ersetzt.

    Nun meine Frage: Wie kann ich es erreichen, dass abhängig vom Fund der Link wie oben in Einzahl oder Mehrzahl erzeugt wird? Bestimmt muss da noch an den Patterns gefeilt werden und im Link die Var $g_word gegen $inhalt ausgetauscht werden. Davor muss die Var $inhalt aber nochmal durch ein $preg_match oder $preg_replace gejagt werden, hmn?

    Hab mich im diversen Foren durchgeforstet aber leider keine eindeutigen Infos gefunden. In Sachen Patterns befinde ich mich auch noch auf relativem Neuland,

    Bitte daher um eure Unterstützung.
    Herzlichen Dank im Voraus und Grüßle

    Andreas

    EDIT: Backslashes werden im Code (Patterns) nicht angezeigt, sind aber vorhanden.
    Zuletzt geändert von devcon1; 07.06.2005, 17:45.

  • #2
    erkär mir lieber mal warum du zuerst preg_match() verwendest und dann nochmal preg_replace() ..

    zu deiner frage: im ersetze_str hast du auch nur g_word angegeben, nicht das fundstück als solches ..
    mfg,
    [color=#0080c0]Coragon[/color]

    Kommentar


    • #3
      Re: preg_match: Einzahl/Mehrzahl berücksichtigen

      Nun meine Frage: Wie kann ich es erreichen, dass abhängig vom Fund der Link wie oben in Einzahl oder Mehrzahl erzeugt wird?
      setze klammern um den zu findenen ausdruck und verwende backreferences, um draufzuzugreifen.
      EDIT: Backslashes werden im Code (Patterns) nicht angezeigt, sind aber vorhanden.
      in den code-tags geht es ...

      btw: atlanten, globen, ... der hund, des hundes,
      Zuletzt geändert von derHund; 07.06.2005, 22:43.
      Die Zeit hat ihre Kinder längst gefressen

      Kommentar


      • #4
        Re: Re: preg_match: Einzahl/Mehrzahl berücksichtigen

        Original geschrieben von derHund
        setze klammern um den zu findenen ausdruck und verwende backreferences, um draufzuzugreifen.
        Ich versuchte es nun w.f (Klammern wurden ja schon vorher verwendet (en|n):
        PHP-Code:
        $inhalt "<zu durchsuchender Original-Content>";
        while(
        datenbank [g_wordg_idauslesen und in array packen
        {
        $suche_str "\\/b".$g_word."(en|n)\\1\\b/i\n";
        $ersetze_str "<a href='glossar.php?id=$g_id'>$g_word</a>";

        if (
        preg_match($suche_str$inhalt))
            {
        $inhalt preg_replace($suche_str$ersetze_str$inhalt);
            }

        ODER auch mit:

        PHP-Code:
        $inhalt "<zu durchsuchender Original-Content>";
        while(
        datenbank [g_wordg_idauslesen und in array packen
        {
        $suche_str "\\/b(".$g_word."(en|n))\\2\\b/i\n";
        $ersetze_str "<a href='glossar.php?id=$g_id'>$g_word</a>";

        if (
        preg_match($suche_str$inhalt))
            {
        $inhalt preg_replace($suche_str$ersetze_str$inhalt);
            }

        Soweit so gut, wurde von mir sicher nicht korrekt angewendet, jedoch habe ich damit lediglich die preg_match Patterns modifiziert, ohne die Ausgabe zu via replace verändern. Wie ändere ich die Ausgabe bzw wie übergebe ich wo Backrefences an preg_replace?

        Könntest du anhand meines Codes mit einem Beispiel zur Verdeutlichung dienen?
        Ich komme mit der Anwendung von Patterns, Backreferences und Unterausdrücken derzeit noch etwas durcheinander. Eine Erläuterung auf Basis meines Codes würde mir hier sehr helfen.

        Vielen Dank!

        p.s.
        Mit "Backslashes werden nicht angezeigt" meine ich meinen Code oben.
        Im Edit-Modus alles vorhanden: $suche_str = "\/b".$g_word."(en|n)\1\b/i\n";

        im View-Modus (jedenfalls bei mir -> Firefox) wird angezeigt: $suche_str = "/b".$g_word."(en|n)1b/i\n";

        Die Backslahes werden bis auf \n nicht angezeigt.
        EDIT: Wenn ich \\ eingebe, wird er angezeigt - ok - im Edit Modus irritierend aber es funktioniert wenigtens in der Ansicht.

        Zuletzt geändert von devcon1; 08.06.2005, 18:28.

        Kommentar


        • #5
          du setzt keine Backreference in den ersetzen teil sondern immer noch die original variable.

          probier mal so:

          PHP-Code:
          $ersetze_str "<a href='glossar.php?id=$g_id'>$1</a>"

          Kommentar


          • #6
            Original geschrieben von ankh
            du setzt keine Backreference in den ersetzen teil sondern immer noch die original variable.

            probier mal so:

            PHP-Code:
            $ersetze_str "<a href='glossar.php?id=$g_id'>$1</a>"
            Dein Beispiel bringt mich nicht weiter.
            Wo wird die Variable $1 definiert?
            Eine Backreferenz wie \1 wird zur Variable?!

            Drücke ich mich wirklich so missverständlich aus?

            Der Link
            PHP-Code:
            $ersetze_str "<a href='glossar.php?id=$g_id'>$g_word</a>"
            soll den gefundenen Strings im Original-Content komplett ersetzen.

            D.h. aus normalem Text "Krone" wird bspw. "<a href='glossar.php?id=55'>Krone</a>"

            Sollte im Text nun "Kronen" gefunden werden, soll dies autom. gemäß den Backreferences durch "<a href='glossar.php?id=55'>Kronen</a>" ersetzt werden - in der Datenbank ist jedoch nach wie vor nur "Krone" definiert.

            "Krone" oder "Kronen" im Text zu finden, ist mittels der Patterns in $suche_str nicht das Problem. Einzig meine Frage: Wie wende ich Backrefences in $suche_str an und wie übergebe ich diese an $ersetze_str ??

            Ich möchte hier um himmelswillen kein fertiges Script definiert haben - ich versuche lediglich zu lernen, wie man Patterns und Backreferences korrekt anwendet.

            Sollte ich die Patterns in meinem Code falsch anwenden, so teilt mir das bitte mit und versucht, dies aussagekräftig zu verdeutlichen. Mit halben Sätzen/Anmerkungen ist mir leider gar nicht geholfen.

            Nobody's perfect - raten bringt aber auch nichts.

            Vielen Dank.
            Zuletzt geändert von devcon1; 10.06.2005, 21:57.

            Kommentar


            • #7
              hmm,

              also, hier erstmal nen ansatz für ein einfaches preg_replace ...
              http://pcre.nophia.de/evaluate/a2c61...dex.php#output

              du mußt es noch anpassen, um nicht z.b. kronentiger auch zu ersetzen ...

              dann erstellst du dir ein array, in dem alle pattern sind, und eines, in dem alle ersatzstrings sind ... preg-replace kann auch arrays verarbeiten.

              das wars schon.

              obwohl sprechende urls natürlich schöner wären ...

              sollte ich morgen früh noch einigermaßen fit sein , bastel ich dir noch was konkretes, ... falls du bis dahin noch nichts hast.
              Zuletzt geändert von derHund; 10.06.2005, 22:58.
              Die Zeit hat ihre Kinder längst gefressen

              Kommentar


              • #8
                $1 oder \1 sind ( derHund möge mich verbessern, wenn's falsch ist) equivalent in php.

                Will sagen, deine Backreference, definiert durch runde Klammerpaare werden entsprechend der Reihenfolge ihres Auftretens als Backreference $1 - $9 gespeichert. (respektive \1-\9).
                $1 wird also implizit, durch das setzen der runden Klammern gesetzt und steht dir somit innerhalb der preg_replace Anweisung als Backreference zur Verfügung.

                bringt dich das so weiter?
                EDIT:
                nebenbei... es gibt noch wesentlich mehr plural suffixe (auto(s), schiff(e), baum(bäume) etc) wär vielleicht Sinnvoll, die RegEx a priori so zu erstellen, dass sie da auch greift.

                hmm..
                am retten, dem Dativ und am rocken, dem Plural

                Zuletzt geändert von ankh; 10.06.2005, 23:32.

                Kommentar


                • #9
                  @derHund
                  dein Link ist eine Bereichung, um die Zusammenhänge an Hand sofortiger Ausgaben auszutesten. Ich werde mich ausgiebig damit beschäftigen.

                  Gehen wir einmal von deinem Optimierungsvorschlag aus, Patterns und Erzatz je in einem Array abzulegen: Beim Ersatz geschieht dies bereits durch eine Datenbankabfrage:
                  PHP-Code:
                  while($glossar_inhalt mysql_fetch_array($glossar_abfrageMYSQL_ASSOC))
                  {
                  ... 
                  Patterns
                  ... preg_match
                  ... preg_replace

                  Diese DB Abfrage mit anschließendem Vergleich folgt in ausgewählten Scripten jeweils nach Definition der Content-Variable und vor Ausgabe des Original-Content.
                  Ich ging bislang davon aus, dass die Definitionen von preg_match und _replace fest vorgegeben sind:

                  preg_match á la <Patterns-Beginn>"Ersatz"<PatternsOptionen><PatternsEnde>
                  preg_replace á la ($suche_nach (DB-Array), $ersetze_mit (preg_match Ergebnis), $ersetze_in (Original-Content))

                  Wo ich jetzt noch hängen bleibe: Wie realisiere ich bei meinem Anliegen bestenfalls die Kombination mit Patterns in einem Array?


                  @ankh
                  Die Übergabe einer Backreference in diesem Fall habe ich jetzt denke mal begriffen. Gehe ich recht in der Annahme, dass mit übergebener Backreference \1 der Link im jetzigen Stadium w. f. lauten müsste?
                  PHP-Code:
                  $ersetze_str "<a href='glossar.php?id=$g_id'>$g_word$1</a>"
                  Mal ganz abgesehen von den Optimierungen, die noch anstehen....

                  Dass die regulären Ausdrücke dringend einer Erweiterung vom simplen (en|n) bedürfen, ist korrekt. Mein Beispiel sollte erst einmal der Verdeutlichung dienen.

                  Ich probiere nun intensiv, das Erfahrene zu verarbeiten. Ich lasse euch das Ergebnis wissen. Natürlich bin ich dankbar, wenn ihr noch weitere Tipps geben könnt.

                  Vorab herzlichen Dank an euch beide!

                  Kommentar


                  • #10
                    stimmt... hab gestern abend irgendwie 'ne klammer um den ganzen suchausdruck gesehen.

                    Kommentar

                    Lädt...
                    X