preg_replace - das was gesucht wird durch (fast) das gleiche ersetzen

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

  • preg_replace - das was gesucht wird durch (fast) das gleiche ersetzen

    Also, ich bin dabei ne Shoutbos zu coden, in der sb soll teilweise HTML erlaubt sein (<b>/<i>/<u>), nur is das problem, dass mir das ganze layout zerschossen wird, wenn jemand nur eines der tags aufmach, aber nicht wieder zu...

    Momentan suche ich folgendes:
    PHP-Code:
    $message preg_replace("/&lt;u&gt;/""<u>"$message);
    $message preg_replace("/&lt;\/u&gt;/""</u>"$message); 
    ich will jetz aber nur dann die htmlentities durch <> ersetzen, wenn das tag auch geschlossen wurde, also müsste ich ja eigentlich das, was er beim suchen zwischen z.b. <b></b> findet irgendwie in ne variable o.ä. schreiben und das dann wieder einfügen ... nur ich hab null ahnung ob un dwie das geht... o_O

    (ich hoffe ich hab das einigermaßen verständlich erklärt ^^)

    MFG psy-

    p.s. hi an alle ... is mein erster post hier ^^

  • #2
    such mal im forum nach "bbcode" und/oder "preg_replace" ... die frage kommt häufiger. das tutorial von sky ist auch ganz nett und in der signatur von derHund findest du einen link zu zu einer site, wo du deine regex testen kannst ...
    Kissolino.com

    Kommentar


    • #3
      Re: preg_replace - das was gesucht wird durch (fast) das gleiche ersetzen

      p.s. hi an alle ... is mein erster post hier ^^
      ja, aber der nick ist (mir) bekannt

      http://www.php-resource.de/forum/sho...threadid=45908

      vieleicht reicht dir auch ne assertion ..
      http://www.php-resource.de/manual.ph...nce.assertions

      findet <ul>, das von </ul> gefolgt wird ...
      Zuletzt geändert von derHund; 15.12.2004, 17:39.
      Die Zeit hat ihre Kinder längst gefressen

      Kommentar


      • #4
        derHund mir auch ... *denk* XHTML/CSS forum ?!
        darüber bin ich auch hier gelandet ^^

        Naja zu deiner Funktion, bzw deinem thread ... danke hat mir weitergeholfen ... auch wenn ich doch keinen bbcode einbaue (dafür aber links, da geht das ja ähnlich)

        MFG psy-

        __edit: scheisse jetz weiß ich was du damit meintest, dass da kein weiterer bbcode mehr drin sein darf (in meinem fall href... *args*)
        Zuletzt geändert von psycho_dmr; 16.12.2004, 10:30.

        Kommentar


        • #5
          hilft dir sowas?
          PHP-Code:
          $text 'a <i>b</i> c <i>d <u>e</u> <i>f</i>';
          $text htmlentities($text);
          $pattern '%&lt;(.*)&gt;(.*?)&lt;(/\\\\1)&gt;%';
          while (
          $text2 preg_replace($pattern'<$1>$2<$3>'$text)) {
            if (
          $text2 == $text)
              break;
            
          $text $text2;
          }
          echo 
          $text
          ist zwar nicht sonderlich elegant, aber es scheint zu funktionieren
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #6
            jo wenn ich die richtig versteh hilf die mir ... thx ich teste die mal.

            __edit: geil klappt ... jetz muss ich nurnoch den fehler rauskriegen das der mir sowas ausspuckt:
            <u>unterstrichen&lt...

            hab da nen script drin das die wortlänge prüft und ggf. das wort abschneidet..
            Zuletzt geändert von psycho_dmr; 16.12.2004, 11:42.

            Kommentar


            • #7
              *denk* XHTML/CSS forum ?!
              könnte sein ...
              hab da nen script drin das die wortlänge prüft und ggf. das wort abschneidet..
              dann schneide doch erst ab, wenn der tag wieder zu ist ... geht auch mit regexp ...
              Die Zeit hat ihre Kinder längst gefressen

              Kommentar


              • #8
                ansich wär das wohl der richtige weg, nu plan ichs nich ... habs grade versucht... bekomm aber immer nen fatal error: max execution time bla..

                PHP-Code:
                //wortlaenge ueberpruefen und evtl. kuerzen


                    
                $msgexp explode(" "$message);
                    
                $count count($msgexp);
                    for(
                $i=$i<$count $i++) {
                     
                $len strlen($msgexp[$i]);
                     if(
                $len>$maxwordlen) {
                         
                $first substr($msgexp[$i], 01);
                         
                         
                $anzeige substr($msgexp[$i], 0$maxwordlen);
                         
                $anzeige $anzeige."...";
                         
                $title $msgexp[$i];
                         
                $msgexp[$i] = "<span class='longword' title='".$title."'>".$anzeige."</span>";
                     }
                    }
                    
                    
                $echomsg "";
                    for(
                $i $i<$count $i++) {
                     
                $echomsg .= $msgexp[$i]." ";
                    }
                    
                    
                $pattern '%&lt;(.*)&gt;(.*?)&lt;(/\\1)&gt;%';
                    while (
                $text2 preg_replace($pattern'<$1>$2<$3>'$echomsg)) {
                      if (
                $text2 == $echomsg)
                        break;
                      
                $echomsg $text2;
                    } 
                der code, hab jetzt eben "nur2 versucht die regex vom mrhappiness woanders hinzustellen, aber habs net hinbekommen o_O

                MFG psy-

                Kommentar


                • #9
                  hmm,

                  das preg_replace braucht nicht in eine schleife ... die dann unendlich läuf, weil sie immer true ist ..

                  preg_replace
                  Die Zeit hat ihre Kinder längst gefressen

                  Kommentar


                  • #10
                    wenn ichs aus der while rausnehm, checkt der verschachtelte tags nicht ... er macht dann nur den nächsten, wenn der vorige geschlossen wird.. -> nich das was ich will ^^

                    das is aber auch nich mein prob ... also hat jemand ne ahnung wie ich das so aufbauen kann, dass der die wörter nicht so komisch abschneidet?

                    ich bin selber jetzt soweit das is mit der $2 aus der regex was machen muss, aber wie und was? :/

                    MFG psy-

                    Kommentar


                    • #11
                      so ich kapitulier jetzt ... wenns jemand packt die funktion so zu schreiben, dass die tag nicht mitzählen wenn die länge gezählt wird (bzw wenn sich dadran jemand versuchen will ^^) ... hf ich checks nicht :/

                      hier nochma der quelltext:
                      PHP-Code:
                      $message nl2br(htmlentities(stripslashes($row->msg)));

                      //wortlaenge ueberpruefen und evtl. kuerzen


                          
                      $msgexp explode(" "$message);
                          
                      $count count($msgexp);
                          for(
                      $i=$i<$count $i++) {
                               
                              
                      $len strlen($msgexp[$i]);
                              if(
                      $len>$maxwordlen) {
                                  
                      $last substr($msgexp[$i], -4);
                          
                      #        if( $last == "&gt;" ) {
                          #            $strturn = strrev($msgexp[$i]);
                          #            $strword = stristr($strturn, ";tl&");
                          #            $strlen = strlen($strword);
                          #            $strtag = substr($msgexp[$i], ($strlen-4));
                          #            $taglen = strlen($strtag);
                          #            $msgexp[$i] = substr($msgexp[$i], 0, "-".$taglen);
                          #            $msgexp[$i] = tags($msgexp[$i], $i);
                          #            $msgexp[$i] = $msgexp[$i].$strtag;
                          #            $msgexp[$i] = tags($msgexp[$i], $i);
                          #        } else {
                                      
                      $anzeige substr($msgexp[$i], 0$maxwordlen);
                                      
                      $anzeige $anzeige."...";
                                      
                      $title $msgexp[$i];
                                      
                      $msgexp[$i] = "<span class='longword' title='".$title."'>".$anzeige."</span>";
                          
                      #        }
                              
                      }
                          }
                          
                          
                      $echomsg "";
                          for(
                      $i $i<$count $i++) {
                           
                      $echomsg .= $msgexp[$i]." ";
                          }
                          
                          
                      $pattern '%&lt;(.*)&gt;(.*?)&lt;(/\\1)&gt;%';
                          while (
                      $text2 preg_replace($pattern'<$1>$2<$3>'$echomsg)) {
                              if (
                      $text2 == $echomsg)
                              break;
                              
                      $echomsg $text2;
                          } 
                      das ganze auskommentiert funzt so nicht, da is irgendwo der wurm drin.. :/ (müsste man eigentlich mit ner regex machen, i weiß)

                      MFG psy-

                      (p.s. sry wegen doppelpost ...)

                      Kommentar


                      • #12
                        hmm,

                        bevor ich jetzt was vorschlage ...

                        was soll passieren, wenn dein text so aussieht:
                        Code:
                        ganzvieltextganzvieltext
                        ganzvieltext<u>ganzvieltextganz
                        vieltext</u>ganzvieltextganz
                        vieltextganzvieltext
                        also, wenn das alles ein zu langes wort ist, innerhalb der tags, vor und hinter den tags aber auch ein zu langes wort steht?

                        das läßt sich imho über (ein bis zwei) regexp recht komfortabel machen, aber bevor ich jetzt das basteln anfang, ... muß ich erstmal weg
                        Die Zeit hat ihre Kinder längst gefressen

                        Kommentar


                        • #13
                          wenn das passier, was du gepostet hast kann der die tags ruhig ignorieren, bzw ganz killen ... wenn ein wort so lang ist, würden die tags eh nur im title des spans auftauchen und da werden die nicht interpretiert...

                          __edit:
                          *donk* is nich die eleganteste lösung, hätte ich aber wirklich eher drauf kommen können...

                          PHP-Code:
                              $message str_replace("'""&quot;"$message);
                              
                          $message str_replace("&lt;"" &lt;"$message);
                              
                          $message str_replace("&gt;""&gt; "$message);
                              
                              
                          $pattern '%&lt;(.*)&gt;(.*?)&lt;(/\\1)&gt;%';
                              while (
                          $text2 preg_replace($pattern'<$1>$2<$3>'$message)) {
                                  if (
                          $text2 == $message)
                                  break;
                                  
                          $message $text2;
                              }
                              
                          //wortlaenge ueberpruefen und evtl. kuerzen
                              
                              
                          $msgexp explode(" "$message);
                              
                          $count count($msgexp);
                              for(
                          $i=$i<$count $i++) {
                                   
                                  
                          $len strlen($msgexp[$i]);
                                  if(
                          $len>$maxwordlen) {
                                      
                                      
                          $anzeige substr($msgexp[$i], 0$maxwordlen);
                                      
                          $anzeige $anzeige."...";
                                      
                          $title $msgexp[$i];
                                      
                          $msgexp[$i] = "<span class='longword' title='".$title."'>".$anzeige."</span>";

                                  }
                              }
                              
                              
                          $echomsg "";
                              for(
                          $i $i<$count $i++) {
                               
                          $echomsg .= $msgexp[$i]." ";
                              }
                              
                              
                          $echomsg str_replace(" &lt;""&lt;"$echomsg);
                              
                          $echomsg str_replace("&gt; ""&gt;"$echomsg); 
                          einfach die tags von den zu langen wörtern zwangstrennen... fertig o_O
                          Zuletzt geändert von psycho_dmr; 16.12.2004, 16:58.

                          Kommentar

                          Lädt...
                          X