1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Unsere jährliche Weihnachts-Banner-Aktion hat begonnen! Wir freuen uns auf viele, viele kreative Vorschläge.
    Mehr dazu könnt Ihr hier nachlesen: Weihnachtsbanner 2016

    Information ausblenden

preg_replace Problem

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von duderino, 02.09.06.

  1. duderino

    duderino Goldparmäne

    Dabei seit:
    26.01.06
    Beiträge:
    556
    Hallo zusammen, ich habe ein kleines Problem mit den regulären Ausdrücken von PHP. Ich habe ein Array mit verschiedenen Begriffen. Nach diesen Begriffen will ich in einer Variable mit Text suchen und durch Werte die in einem anderen Array stehen ersetzen. Das Problem an der Sache ist, dass ich nur komplette Wörter ersetzen möchte. Wortabschnitte sollen nicht beachtet werden. D.h. wenn das Wort "Angel" in meinem Array steht, soll auch nur das Wort Angel ersetzt werden, nicht z.B. auch Angelrute oder Angelhaken.

    Wäre toll wenn mir jemand helfen könnte.

    Grüße
     
  2. Salzi

    Salzi Prinzenapfel

    Dabei seit:
    29.08.06
    Beiträge:
    555
    Hallo

    Erstmal als Vorwarnung: Mit regulären Ausdrücken hab ichs auch net so drauf ...
    Aber trotzdem mein Versuch.
    Im Grunde sehr einfach. Am Anfang eines Wortes welches ersetzt werden muss, muss /\b stehen. Am Ende dann \b/.

    Hab hier mal 2 kleine Scripts die das verdeutlichen sollen:

    Code:
    $string = 'Er wohnt auf einem schönen Baumhaus';
    echo $string."<br>";
    $patterns[0] = '/\bwohnt\b/';
    $patterns[1] = '/\bauf\b/';
    $patterns[2] = '/\bhaus\b/';
    $replacements[2] = 'lebt';
    $replacements[1] = 'in';
    $replacements[0] = 'wohnung';
    echo preg_replace($patterns, $replacements, $string);
    Ausgabe:
    Code:
    Er wohnt auf einem schönen Baumhaus
    Er lebt in einem schönen Baumhaus
    wohnt und auf wird also ersetzt. Nicht aber das Baumhaus.

    Damit du das nicht vor jeden Suchwort eingeben musst lässt sich das ganze auch in einer Schleife verarbeiten. (Tut mir mal echt Leid mir gefällt die Lösung nur bedingt. Gibt ganz bestimmt elegantere Lösungen also diese hier aber ich komm beim besten Willen nicht drauf :()

    Code:
    $string = 'Er wohnt auf einem schönen Baumhaus';
    echo $string."<br>";
    $patterns[0] = 'wohnt';
    $patterns[1] = 'auf';
    $patterns[2] = 'haus';
    $replacements[0] = 'lebt';
    $replacements[1] = 'in';
    $replacements[2] = 'wohnung';
    
    $counter=count($patterns);
    for($i=0; $i<$counter; $i++)
    {
        $string= preg_replace("/\b".$patterns[$i]."\b/", $replacements[$i], $string); 
    }
    
    echo $string;
    Die Ausgabe ist die gleiche.

    Ich hoffe ich konnte bischen Licht ins Dunkel bringen.

    Gruss

    Salzi
     
    duderino gefällt das.
  3. duderino

    duderino Goldparmäne

    Dabei seit:
    26.01.06
    Beiträge:
    556
    Hey, super. Soweit ich das sagen kann hat es funktioniert. Danke!!!
     
  4. duderino

    duderino Goldparmäne

    Dabei seit:
    26.01.06
    Beiträge:
    556
    Habe leider nochmal eine kleines Problem mit preg_replace. Und zwar will ich wieder wie oben, Text mit dem Inhalt einer Variable ersetzen (siehe erster Post).

    Nach der Hilfe von Salzi funktioniert das auch alles soweit. Allerdings funktioniert das ganze nicht wenn in dem zu ersetzenden Teil ein § (Paragraphenzeichen) steht. Das Zeichen ist in der Variable UND im Text als HTML-Code maskiert. Muss man solche Zeichen speziell maskieren oder in den regulären Ausdrücken besonders beachten?

    Grüße
    duderino
     
  5. Sir Q

    Sir Q Rheinischer Winterrambour

    Dabei seit:
    12.04.05
    Beiträge:
    921
    Verständnisfrage
    • Du hast einen Text: „Hallo, ich bin ein Blindtext - ich bin von Natur aus blind. Ich wurde Blind geboren und werde wohl auch blind sterben.”

    • Du möchstest „blind” gegen „blöd” tauschen, aber „Blindtext” soll „Blindtext” bleiben.


    Lösungsansatz
    Wenn ich das so richtig verstanden habe, ist die Wahl zwischen schönem-code und effizenz im moment die:
    a)
    » Performant bei vielen Worten im Array und langem Text
    1. Array mit Wort gegen Wort
    2. Array mit „erlaubten Satzzeichen”
    3. Merger-Function die ein neues Array generiert
    4. strtr anstelle der regular-expression


    b)
    » Performant bei wenigen Worten und kürzerem Text
    1. Array mit Wort
    2. Array mit Gegenwort
    3. regular_expression so bauen das [erlaubtezeichen]$array[erlaubtezeichen]
    4. preg_replace


    Beispiel für das Resultat aus a.3.

    Wort gegen Wort ist eindeutiger als bei korrespondierenden Arrays
    $wort_gegen_wort["Bier"] = "Uhuknie";
    $wort_gegen_wort["kaufen"] = "rauben";


    Erlaubte Zeichen definiert, welche Zeichen vorkommen dürfen
    $erlaubte_zeichen = array(" ", ".");

    Ergebnis nach dem Mergen durch eine selbst zu schreibende Funktion
    " Bier " = " Uhuknie ";
    " Bier." = " Uhuknie.";
    ".Bier " = ".Uhuknie ";
    ".Bier." = ".Uhuknie.";
    " kaufen " = " rauben ";
    " kaufen." = " rauben.";
    ".kaufen " = ".rauben ";
    ".kaufen." = ".rauben.";


    Funktionsaufruf
    $text = strtr($text, $wort_gegen_wort_merged);
     
    #5 Sir Q, 26.09.06
    Zuletzt bearbeitet: 26.09.06
  6. duderino

    duderino Goldparmäne

    Dabei seit:
    26.01.06
    Beiträge:
    556
    Also:

    Ich habe folgenden Text:
    Hallo, ich bin ein Text ich will nicht viel und ich bin auch sehr anspruchslos.

    Dann habe ich eine Datenbank mit ca. 1000 Begriffen. Diese Begriffe schreibe ich in ein Array und lass eine Schleife durchlaufen die den Text auf eines der gespeicherten Wörter durchsucht. Wenn ein Wort überein stimmt wird automatisch ein Link über das Wort gelegt. Das funktioniert auch soweit alles mit preg_replace.

    Wenn ich jetzt allerdings folgenden Text habe:
    Ich bin ein § im Ruhestand und mir gefällt es so wie es ist!

    Und in der Datenbank steht z.B. "§ im Ruhestand", wird von meinem Script nicht erkannt dass es sich hier um 2 identische Inhalte handelt.

    Hoffe das hilft weiter...
     
  7. Sir Q

    Sir Q Rheinischer Winterrambour

    Dabei seit:
    12.04.05
    Beiträge:
    921
    So?
    $ersetzen["§ im Ruhestand"] = '<a href="http://....">§ im Ruhestand</a>';
    $ersetzen["§123 GbG"] = '<a href="http://....">§123 GbG</a>';

    $text = strtr($text, $ersetzen);
     
  8. duderino

    duderino Goldparmäne

    Dabei seit:
    26.01.06
    Beiträge:
    556
    Joa, so sollte es gehen. Ob dieses Beispiel funktioniert weiß ich nicht, aber in meiner preg_replace funktioniert das nicht.
     

Diese Seite empfehlen