Hilfe bei einem Script - RegEx / Arrays / Wörter ohne Sonderzeichen

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

  • Hilfe bei einem Script - RegEx / Arrays / Wörter ohne Sonderzeichen

    Hallo,

    ich entwickle gerade einen Mambot für Joomla. Mit dem Bot möchte ich den Inhalt einer Seite durchsuchen. Der Bot soll jedes einzelne Wort eines Absatzes das zwischen Geschweiftenklammern steht, mit einem bestimmten Wert vergleichen und wenn das zu trifft, soll es z.B. fett dargestellt werden.

    Der Text sieht z.B. so aus:
    {Hier steht irgendein Text bla bla,} in dem einige Teile des Textes bla mit bestimmten Klammern umklammert sind. bla_bla-bla! Alle Wörter in diesen Bereichen sollen separat ausgelesen werden} und {mit bla.bla, einem anderen Wert verglichen werden. bla_bla-bla.}
    Und nach dem Durchlauf des Bots soll es so aussehen: (zur besseren Übersicht zusätzlich andere Farbe!)
    {Hier steht irgendein Text [COLOR="DarkGreen"]bla[/COLOR] [COLOR="DarkGreen"]bla[/COLOR],} in dem einige Teile des Textes bla mit bestimmten Klammern umklammert sind. bla_bla-bla! {Alle Wörter in diesen Bereichen sollen separat ausgelesen werden} und {mit [COLOR="DarkGreen"]bla[/COLOR].[COLOR="DarkGreen"]bla[/COLOR], einem anderen Wert verglichen werden. [COLOR="DarkGreen"]bla[/COLOR]_[COLOR="DarkGreen"]bla[/COLOR]-[COLOR="DarkGreen"]bla[/COLOR].}
    Bis jetzt bin ich soweit gekommen, jedoch ist der Code unschön, da er denke ich zu lang und komplex ist und ich Probleme habe mit Sonderzeichen wie , . - _ ! u.s.w. und er sucht leider den ganzen Text durch und nicht jeden speziellen Bereich der zwischen { und } steht.

    Könnte mir jemand da bitte weiterhelfen? Habe erst vor ein paar Tagen mit PHP angefangen und es übersteigt etwas meine Fähigkeiten. Besonders wenn es um die Sonderzeichen geht, die hinter oder vor einem Wort stehen. Z.B.: "Hallo[COLOR="Red"],[/COLOR] es freut mich Sie kennen zu lernen[COLOR="Red"]![/COLOR]"

    Mein Code:
    PHP-Code:
    $regex =  "/\{(.*?)\}/";

        
    $html_temp preg_replace($regex"$1", <HierKommtDerInhaltRein>);
            
        
    $html_array = array();
        
    $html_array preg_split("/(\s)/"$html_temp);

        
    $word_array = array();

        for(
    $i 0$i count($html_array); $i++) {
          
    $word $html_array[$i];            
          
    $title "<HierDasGesuchteWort>";
          
          if(
    strrpos($word",") == true) {
             
    $word_array explode(","$word);
                    
            for(
    $c 0$c count($word_array); $c++) {
              if(
    strlen(trim($word_array[$c])) > 1) {
                if(
    preg_match("|" strtolower("\b" $title "\b") . "|"strtolower($word_array[$c]))) {
                  
    $html_content .= "<b>" $word_array[$c] . "</b>, ";
                } else {
                  
    $html_content .= $word_array[$c] . ", ";
                }
              }
            }
          } else {
              if(
    preg_match("|" strtolower("\b" $title "\b") . "|"strtolower($word))) {
                
    $html_content .= "<b>" $word "</b> ";
              } else {
                
    $html_content .= $word " ";
              }
          }
        }

        echo(
    $html_content); 
    Windows XP
    PHP4
    XAMPP / Joomla 1.5
    php.ini (Standard, ohne Veränderung)


    Chris

  • #2
    Das klingt relativ aufwändig. Ich denke am schnellsten wirst du mit einem preg_replace_callback() ans Ziel kommen. Der reguläre Ausdruck sucht die Treffer (alles zwischen { und }) und übergibt diese an eine callback Funktion welche die Werte auf deine Anforderungen prüft und entsprechend reagiert.
    Wegen den Sonderzeichen, da wären folgende Seiten wichtig:
    RegExp Modifikatoren und Pattern Syntax
    Ganz grundsätzlich musst du in deinem Pattern alle Zeichen, welche im RegExp eine spezielle Bedeutung haben, mittels \ escapen. Also \{ und nicht {

    Gruss

    tobi
    Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

    [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
    Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

    Kommentar


    • #3
      Also ich habe es jetzt vorerst so gemacht:
      EDIT:

      $regex_block = "#\{(.*?)\}#";

      $search = '<DasGesuchteWort>';
      $regex_word = '#(?<![a-z])' . preg_quote($search) . '(?![a-z])#i';

      $html_temp = preg_replace($regex_block, "$1", <DerInhalt>);
      $html_content = preg_replace($regex_word, '<b>\0</b>', $html_temp);

      $row->text = $html_content;



      Doch mit den {} habe ich noch so meine Probleme.

      Edit: Das mit dem Pattern habe ich gemacht, das Forum zeigt sie nur nicht richtig an, wenn ich den PHP-TAG verwende.
      Zuletzt geändert von Chris_48; 27.09.2007, 15:54.

      Kommentar


      • #4
        Doch mit den {} habe ich noch so meine Probleme.
        Die nimmst du ja einfach aus dem Text raus. Und dann willst du den Text irgenwie weiter verarbeiten. Dort begrife ich nicht wie (nachdem die Klammen raus sind).
        Vielleicht machst du einmal ein Beispiel eine Textes vor der Verarbeitung, und dann wie er nachher aussehen soll
        Gruss
        H2O

        Kommentar


        • #5
          Vor der Verarbeitung:
          {Hier steht irgendein Text bla bla,} in dem einige Teile des Textes bla mit bestimmten Klammern umklammert sind. bla_bla-bla! {Alle Wörter in diesen Bereichen sollen separat ausgelesen werden} und {mit bla.bla, einem anderen Wert verglichen werden. bla_bla-bla.} Wenn die Werte (bla == {bla) ist, soll es fett werden.}
          Nach der Verarbeitung:
          Hier steht irgendein Text bla bla, in dem einige Teile des Textes bla mit bestimmten Klammern umklammert sind. bla_bla-bla! Alle Wörter in diesen Bereichen sollen separat ausgelesen werden und mit bla.bla, einem anderen Wert verglichen werden. bla_bla-bla. Wenn die Werte (bla == bla) ist, soll es fett werden.
          Punkte, Striche, etc. die direkt vor oder nach einem "bla" kommen sollen nicht fett werden. Nur das Wort an sich. Und nur die "blas", die zwischen { und } stehen. Die { } sollen nach der Verarbeitung nicht mehr zu sehen sein.
          Zuletzt geändert von Chris_48; 28.09.2007, 09:56.

          Kommentar


          • #6
            z.B.
            PHP-Code:
            $suchwort 'bla'
            $p1 '/\{(.*)\}/U'
            $p2 "/($suchwort)/U";
            $string1 preg_replace_callback($p1"repl_func"$string); 

            function 
            repl_func($str2){ 
                global 
            $p2;     
                return(
            preg_replace($p2"<b>$1</b>"$str2[1]));

            Gruss
            H2O

            Kommentar


            • #7
              @Chris
              Hast du jetzt mal zum Thema preg_replace_callback() ins Manual geschaut? Du machst einen RegExp, der alles zwischen { und } matched. Dieser Match wird erst an die callback Fkt übergeben. Diese callback Fkt prüft den übergebenen String und bereitet ihn für die Ersetzung auf d.h. setzt die bla bla in <strong>-Tags und gibt den String wieder an preg_replace zurück.
              Also irgendwie so
              PHP-Code:
              function prepareString($string){
                return 
              preg_replace('/\\b(bla)\\b/i','<strong>\\1</strong>',$string[1]);
              }
              $reg '/\\{([^\\}]*)\\}/';
              echo 
              preg_replace_callback($reg,'prepareString',$deinString
              Gruss

              tobi

              EDIT:

              Kleine Korrektur damit nur das ganze Wort bla und nicht ein Wortbestandteil bla ersetzt wird

              Zuletzt geändert von jahlives; 28.09.2007, 11:04.
              Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

              [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
              Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

              Kommentar


              • #8
                Danke an euch zwei, sowas habe ich auch schon hinbekommen.
                Jedoch würde ich gerne mehrere Parameter an "prepareString" bzw. "repl_func" übergeben. Und globale Variablen sind unschön finde ich.

                Kommentar


                • #9
                  Original geschrieben von Chris_48
                  globale Variablen sind unschön finde ich.
                  Ich auch. Aber, wie du sicher im Handbuch gesehen hast , erwartet die Callback-Funktion ein Argument, nämlich den Resultat-Array. Deshalb sehe ich hier keine andere Möglichkeit. Falls der Suchbegriff immer der selbe ist, kannst du ihn natürlich direkt in der Funktion definieren.
                  Und falls du den Begriff nur als ganzes Wort ersetzt haben willst, sind natürlich die von jahlives erwähnten "\b" wichtig.
                  Gruss
                  H2O

                  Kommentar


                  • #10
                    Ja, leider. Aber das mit dem Argument habe ich schon gelesen.

                    Und das mit \b habe ich etwas anders gemacht.

                    EDIT:
                    $regex = "/(?<![a-z])" . preg_quote('bla') . "(?![a-z])/i";

                    Kommentar


                    • #11
                      Original geschrieben von Chris_48
                      Und das mit \b habe ich etwas anders gemacht.
                      OK, wenn du das besser findest. Ich begreif diese Ausdrücke einfach nicht, aber vielleicht kannst du sie mir erklären. Wenn ich in meinem Code $p2 durch deinen Ausdruck ersetze wird auf jeden Fall nichts mehr ersetzt.
                      Gruss
                      H2O

                      Kommentar

                      Lädt...
                      X