kleines problem mit board-code, regulären ausdrücken usw...

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

  • kleines problem mit board-code, regulären ausdrücken usw...

    so, ich hab mal wieder n kleines problem
    und zwar hab ich in meinem forum nen boardcode. natürlich alles marke eigenbau, aber trotzdem recht umfangreich. aber was wäre marke eigenbau ohne diverse bugs!

    mein aktueller bug is folgender:
    ich habe (wenn html abgeschaltet is) erstmal die html-zeichen umgewandelt mit
    if($html == "1"){$dertext = htmlspecialchars($dertext);}
    soweit so gut, als nächstes hab ich dann nen regulären ausdruck drin, der mir URLs im text findet und als link aufbereitet. leider hat der aber, weil ja vorher auch die & in & umgewandelt wurden beim ersten & in einer url abgebrochen, so dass ich nur halbe links hatte.
    das hab ich jetzt gelöst indem ich den htmlspecialcars auskommentiert und dafür 5 entsprechende str_replace genommen hab, die das gleiche tun, so als notlösung. dabei werden erst vier zeichen umgewandelt und erst nach den URLs das &. das dumme is nur dass jetzt die bereits umgewandelten zeichen von dem &-umwandler nochmal angefallen werden.

    Und damit jetzt n paar Leute meine ausführungen auch nachvollziehen können, hier mal der Quelltext, aber vorsicht, sind mehrere tausend zeilen .

    PHP-Code:
    function formaturl($url$title=""$maxwidth=60$width1=40$width2=-15)
        {
        if(!
    trim($title)) $title=$url;
        if(!
    preg_match("/[a-z]:\/\//si"$url)) $url "http://$url";
        if(
    strlen($title)>$maxwidth$title substr($title,0,$width1)."...".substr($title,$width2);
        return 
    "<a href=\"$url\" onclick=\"window.open('$url'); return false;\">".str_replace("\\\"""\""$title)."</a>";
        }
    function 
    formatimg($url)
        {
    //+++    hier wird das [img][/img] in eine bild-url umgewandelt
        
    ...
        }

    function 
    prepare_code($out)
        { 
        if(!isset(
    $searcharray) && !isset($replacearray))
            {
            global 
    $db;

            
    $urlsearch[]="/([^]_a-z0-9-=\"'\/])((https?|ftp):\/\/|www\.)([^ \r\n\(\)\*\^\$!`\"'\|\[\]\{\};<>]*)/si";
            
    $urlsearch[]="/^((https?|ftp):\/\/|www\.)([^ \r\n\(\)\*\^\$!`\"'\|\[\]\{\};<>]*)/si";
            
    $urlreplace[]="\\1[URL]\\2\\4[/URL]";
            
    $urlreplace[]="[URL]\\1\\3[/URL]";
            
    $out preg_replace($urlsearch$urlreplace$out);

            
    $searcharray[]="/\[url=(['\"]?)([^\"']*)\\1](.*)\[\/url\]/esiU";
            
    $replacearray[]="formaturl('\\2','\\3')";
            
    $searcharray[]="/\[url]([^\"]*)\[\/url\]/esiU";    
            
    $replacearray[]="formaturl('\\1')";
            
    $searcharray[]="/\[img]([^\"]*)\[\/img\]/esiU";    
            
    $replacearray[]="formatimg('\\1')"
            
    $threeparams "/\[%s=(['\"]?)([^\"']*),([^\"']*)\\1](.*)\[\/%s\]/siU";
            
    $twoparams "/\[%s=(['\"]?)([^\"']*)\\1](.*)\[\/%s\]/siU";
            
    $oneparam "/\[%s](.*)\[\/%s\]/siU"

            
    $result send_sql($db,"SELECT bbcodetag,bbcodereplace,params FROM cc_boardcode");
            
    $anz=mysql_num_rows($result);
            for(
    $ix=0;$ix<=$anz;$ix++)
                {
                
    $row mysql_fetch_array($result,MYSQL_ASSOC);
                if(
    $row[params]==0) continue;
                if(
    $row[params]==1$search sprintf($oneparam$row[bbcodetag], $row[bbcodetag]);
                if(
    $row[params]==2$search sprintf($twoparams$row[bbcodetag], $row[bbcodetag]);
                if(
    $row[params]==3$search sprintf($threeparams$row[bbcodetag], $row[bbcodetag]);
                
    $searcharray[] = $search;
                
    $replacearray[] = $row[bbcodereplace];
                } 
            }
        
    $out preg_replace($searcharray$replacearray$out);
        return 
    $out;
        }

    // ************************************** Textbearbeitung ************************************ //
    function textbearbeitung($dertext,$html)
        {
        global ...
        ...
        global ...
    //*** HTML-zeichen killen
    //    if($html == "1"){$dertext = htmlspecialchars($dertext);}
        
    if($html == "1")
            {
            
    $dertext str_replace("<","&lt;",$dertext);
            
    $dertext str_replace(">","&gt;",$dertext);
            
    $dertext str_replace("\'","'",$dertext);
            
    $dertext str_replace("\"","&quot;",$dertext);
            }
    //*** Code einfügen
        
    $dertext str_replace("\n\n","<br>&nbsp;<br>",$dertext);
        
    $dertext str_replace("\n","<br>",$dertext);
        
    $dertext prepare_code($dertext);
    //*** restliche HTML-zeichen killen...
        
    if($html == "1")
            {
            
    $dertext str_replace("&","&amp;",$dertext);
            }
        return 
    $dertext;
        } 
    die funktionen werden per include eingebunden und dann wird einfach im bedarfsfall die funktion "textbearbeitung" augerufen und der umzuwandelnde text als $dertext übergeben. Der entsprechende abschnitt is normalerweise viel größer, aber ich hab das für hier jetzt mal aufs wesentliche reduziert...

    so, mein lögungsansatz wär jetzt folgender: Ich hau die fünf str_replace wieder raus und aktivier den htmlspecialcars wieder. sprich machs wies vorher war, und hab wieder das problem dass die urls "abgeknickt" werden.
    und dann hoff ich auf eure hilfe, vielleicht kann mir jemand den regulären ausdruck oben bei $urlsearch[] so umschreiben dass er das richtig macht? ich hab nämlich dummerweise keine ahnung von regexp...

    BTW hab ich im quelltext vom SMF-forum was interessantes gefunden, nen ellenlangen ausdruck, der mir jetzt zu lang war um ihn hier einzufügen ich denk mal damit könnt man was anfangen, ich habs aber net geschafft... Bei gelegenheit kann ich den (mit n paar zusätzlichen zeilenumbrüchen) hier posten.

    Ich hoffe ihr könnt mir helfen!!

    Matthias
    diese signatur ist nichtssagend...

  • #2
    Re: kleines problem mit board-code, regulären ausdrücken usw...

    PHP-Code:
    $urlsearch[]="/([^]_a-z0-9-=\"'\/])((https?|ftp):\/\/|www\.)([^ \r\n\(\)\*\^\$!`\"'\|\[\]\{\}<>]*)/si";
            
    $urlsearch[]="/^((https?|ftp):\/\/|www\.)([^ \r\n\(\)\*\^\$!`\"'\|\[\]\{\}<>]*)/si";
            
    $urlreplace[]="\\1[URL]\\2\\4[/URL]";
            
    $urlreplace[]="[URL]\\1\\3[/URL]";
            
    $out preg_replace($urlsearch$urlreplace$out); 
    Sollte reichen, bin aber nicht sicher...

    [edit] Ich hab das Komma aus dem Regex entfernt, falls die Änderung nicht auffallen sollte ^^
    Zuletzt geändert von ghostgambler; 10.01.2005, 17:21.

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      Re: Re: kleines problem mit board-code, regulären ausdrücken usw...

      Original geschrieben von ghostgambler
      PHP-Code:
      $urlsearch[]="/([^]_a-z0-9-=\"'\/])((https?|ftp):\/\/|www\.)([^ \r\n\(\)\*\^\$!`\"'\|\[\]\{\}<>]*)/si";
              
      $urlsearch[]="/^((https?|ftp):\/\/|www\.)([^ \r\n\(\)\*\^\$!`\"'\|\[\]\{\}<>]*)/si";
              
      $urlreplace[]="\\1[URL]\\2\\4[/URL]";
              
      $urlreplace[]="[URL]\\1\\3[/URL]";
              
      $out preg_replace($urlsearch$urlreplace$out); 
      Sollte reichen, bin aber nicht sicher...

      [edit] Ich hab das Komma aus dem Regex entfernt, falls die Änderung nicht auffallen sollte ^^
      btw. es sieht so aus, als ob deine Ersetzung nicht funktionieren kann, Stichwort unescape von Anführungszeichen und einem Blick auf das Forumshighlight...

      und error_reporting(E_ALL), sollte dich auch interessieren, wenn keine Fehlermeldungen kamen bei dir, was ich eigentlich fast nicht vermute!! Vermuten kann!

      Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

      bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
      Wie man Fragen richtig stellt

      Kommentar


      • #4
        also soweit funktioniert er schon, urls werden ersetzt!
        und zwar egal ob ich sie einfach so reinstell oder zwischen [ url ] und [ /url ] pack.
        also er tut seine arbeit, nur halt nicht 100%ig.
        das mit dem ; funktioniert leider nicht...

        error_reporting werd ich mal versuchen, vielleicht komtm was dabei raus!

        Edit: whoa da bekomm ich ja ne menge fehler hingeschmissen, wusste gar net dass mein quelltext so mies is! da hab ich die nächste zeit wohl einiges zu tun
        aber im prinzip hab ich nur
        Notice: Undefined variable:
        und
        Notice: Use of undefined constant
        und zwar in mengen, vermutlich wegen meinen schleifen. scheint aber nicht viel mit dem url-teil zu tun haben...
        Zuletzt geändert von CrazyChaos; 10.01.2005, 17:41.
        diese signatur ist nichtssagend...

        Kommentar


        • #5
          Aber genau dafür ist der doch da???
          PHP-Code:
          $urlsearch[]="/([^]_a-z0-9-=\"'/])((https?|ftp)://|[url]www.[/url])([^ \r\n()*^\$!`\"'|[]{};<>]*)/si";
                  
          $urlsearch[]="/^((https?|ftp)://|[url]www.[/url])([^ \r\n()*^\$!`\"'|[]{};<>]*)/si";
                  
          $urlreplace[]="\1<a href="http://\2\4" target="_blank">\2\4</a>";
                  
          $urlreplace[]="<a href="http://\1\3" target="_blank">\1\3</a>";
                  
          $out preg_replace($urlsearch$urlreplace$out); 
          Da steht ja auch nichts von [url] oder so, sondern der ersetzt die Links......

          Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

          bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
          Wie man Fragen richtig stellt

          Kommentar


          • #6
            moment - kleiner nachtrag:
            nen link den ich mit [ url ] und [ url ] einsetz erkennt er ohne weiteres! nur mit direkt eingefügten spackt er rum!

            auch deswegen geh ich davon aus dass was in der gegen "$urlsearch[]" nicht hinhaut.
            is warscheinlich nur was klitzekleines...
            diese signatur ist nichtssagend...

            Kommentar


            • #7
              Original geschrieben von CrazyChaos
              moment - kleiner nachtrag:
              nen link den ich mit [ url ] und [ url ] einsetz erkennt er ohne weiteres! nur mit direkt eingefügten spackt er rum!

              auch deswegen geh ich davon aus dass was in der gegen "$urlsearch[]" nicht hinhaut.
              is warscheinlich nur was klitzekleines...
              Irgendwie versteh ich den Code immer weniger...wieso werden sowohl normale URLs, als auch BB-Code-ähnliche-Links ersetzt??? Das kann doch nur zu problemen führen!
              Ist das überhaupt dein Code???

              Jetzt änder erstmal das mit den Anführungszeichen, dann entfernst du mal das Komma aus dem Pattern und dann postest du den Code nochmal, und auch das, was rauskommt und was deiner Meinung nach falsch ist und natürlich auch, wie es richtig rauskommen soll!!!

              Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

              bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
              Wie man Fragen richtig stellt

              Kommentar


              • #8
                Re: kleines problem mit board-code, regulären ausdrücken usw...

                [sarkasmus]
                klar isses mein code, weil ich ja auch so viel von regulären ausdrücken versteh.
                [/sarkasmus]
                selfcite:
                Original geschrieben von CrazyChaos
                ich hab nämlich dummerweise keine ahnung von regexp...
                was meinst du warum ich hier frag?
                die teile mit den regulären ausdrücken sin aus nem anderen board, ich glaub wbboard wars. die hab ich für meinen code angepasst und eingebaut.

                und da diese ausdrücke für mich aussehen wie japanisch weiß ich net wo anführungszeichen hingehören bzw was und wie escaped werden muss.
                ich hab mal versucht mich in regexp einzuarbeiten, habs aber schnell wieder aufgegeben.

                und ja, es soll beides umgewandelt werden, sowohl urls die zwischen [ url ] sind, weil das schlicht zu meinem boardcode gehört, als auch freistehende urls, weil nicht jeder lust hat nen [ url ] srum zu machen.

                danke für die hilfe!

                edit: irgendwas haut da nicht hin, mit der anzeige hier. der zeigts nicht so an wie ichs im editor hab.

                PHP-Code:
                $urlsearch[]="/([^]_a-z0-9-=\"'\/])((https?|ftp):\/\/|www\.)([^ \r\n\(\)\*\^\$!`\"'\|\[\]\{\};<>]*)/si";
                $urlsearch[]="/^((https?|ftp):\/\/|www\.)([^ \r\n\(\)\*\^\$!`\"'\|\[\]\{\};<>]*)/si";
                $urlreplace[]="\\1[URL]\\2\\4[/URL]";
                $urlreplace[]="[URL]\\1\\3[/URL]"
                Zuletzt geändert von CrazyChaos; 10.01.2005, 19:22.
                diese signatur ist nichtssagend...

                Kommentar


                • #9
                  so solls aussehen!
                  Angehängte Dateien
                  diese signatur ist nichtssagend...

                  Kommentar


                  • #10
                    Das, was ich in der png sehe, ist was gaaanz anderes, als das, worüber wir die ganze Zeit schon labern...
                    Weil du da versuchst, um die URL, die eben nicht vom Code eingeschlossen sind, den Code zu setzen.
                    Und dann kann ich eigentlich nur sagen: Viel Spaß!
                    Die einzige vernünftige Lösung, die mir einfällt, ist diese:
                    Trennen des Textes per preg_split, bei den Sachen http://www.testdot.com usw, in Kombi mit dem Flag PREG_SPLIT_DELIM_CAPTURE, damit nix vom Text verloren geht.
                    Dann per foreach durchgehen des gesamten Textes und prüfen, ob die ersten 5 Zeichen == und die letzten 6 Zeichen == sind, falls ja continue; wenn nicht Links per preg_replace suchen und mit und umschreiben.
                    Hinterher, per implode('', $Array_mit_Text);, den Text wieder zusammenfügen und in die Datenbank speichern.
                    Dann bei jeder Ausgabe, per preg_replace nach den 's suchen und durch die Links ersetzen (das funktionierte ja eh schon, nicht?)

                    So und bevor ich mir weiter die Finger wund tippe:
                    www.php.net/preg_split
                    www.php.net/preg_replace
                    http://de3.php.net/manual/de/referen...ern.syntax.php
                    http://de3.php.net/manual/de/referen....modifiers.php
                    http://www.php-resource.de/tutorials/read/10/1/

                    Happy funny with reading, im busy with watching TV


                    Außerdem noch was:
                    PHP-Code:
                    $row mysql_fetch_array($result,MYSQL_ASSOC);
                                if(
                    $row[params]==0) continue; 
                    Wieso nicht sofort $row = mysql_fetch_assoc($result)?
                    Und wieso sprichst du ein assoziatives Array beim Key ohne einfache Anführungszeichen an???
                    es müsste lauten: $row['params']

                    Und wenn wir schon dabei sind, verweise ich gleich noch auf meine Signatur, vor allem auf den ersten Link.
                    http://area51.phpbb.com/docs/guide-standards.html
                    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!
                    Über sowas, ärgerst du dich später nur Tod, wenn du deinen eigenen Code nicht mehr lesen kannst, weil du zu faul warst ein paar Zeilenumbrüche und eckige Klammern hinzumachen...
                    PHP-Code:
                     for($ix=0;$ix<=$anz;$ix++)
                                {
                                
                    $row mysql_fetch_array($result,MYSQL_ASSOC);
                                if(
                    $row[params]==0) continue;
                                if(
                    $row[params]==1$search sprintf($oneparam$row[bbcodetag], $row[bbcodetag]);
                                if(
                    $row[params]==2$search sprintf($twoparams$row[bbcodetag], $row[bbcodetag]);
                                if(
                    $row[params]==3$search sprintf($threeparams$row[bbcodetag], $row[bbcodetag]);
                                
                    $searcharray[] = $search;
                                
                    $replacearray[] = $row[bbcodereplace];
                                } 
                            } 
                    Und diese hier
                    PHP-Code:
                    global ...
                    global ... 
                    sind auch nicht das gelbe vom Ei. Ich empfehle dir einen Blick auf Referenzen
                    http://www.php.net/manual/de/functio...s.by-reference
                    Oder Rückgabe per Array.


                    So, morgen bin ich vielleicht nochmal da, wenn du bis dahin alles gelesen hast

                    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                    Wie man Fragen richtig stellt

                    Kommentar


                    • #11
                      also erstmal vorweg: ich persönlich find meinen code sehr übersichtlich, ich muss immer anderer leute code zerlegen um einigermaßen durchzusteigen
                      Naja und die sache mit den geschweiften klammern, normalerweise mach ich die auch wegen jeder zeile, aber das is halt wie gesagt mehr oder weniger kopierter code, und nachdem der bei mir funktioniert hat hab ichs gelassen...
                      und was hast du gegen global?

                      aber wie auch immer, zurück zum code.
                      1. ich möchte am text selber eigentlich nix verändern, der soll in der datenbank gespeichert werden wie er geschrieben wurde, und alles was zu verändern is mach ich beim aufrufen. damit bleibt das ganze flexibel.
                      2. ich möchte einfach, dass alles was zwischen http:// bzw. www. (o.ä.) und dem nächsten leerzeichen, zeilenumbruch oder textende steht als URL erkannt und von [ url ] und [ /url ] eingeschlossen wird (um genau zu sein soll dass dann so aussehen: [ url=eingegebeneurl ]eingegebeneurl[ /url ]
                      das muss doch irgendwie simpel in besagten zeilen (die in der png) zu machen sein oder?


                      und ach ja, wie gesagt hab ich schon versucht mich in die regulären ausdrücke einzulesen, hat aber eben nicht hingehaun
                      diese signatur ist nichtssagend...

                      Kommentar


                      • #12
                        Original geschrieben von CrazyChaos
                        1. ich möchte am text selber eigentlich nix verändern, der soll in der datenbank gespeichert werden wie er geschrieben wurde, und alles was zu verändern is mach ich beim aufrufen. damit bleibt das ganze flexibel.
                        Er wird wesentlich flexibler, wenn du es vernünftig anpasst.
                        Das du vorher nicht nl2br oder so auf den Text anwenden solltest, ist klar, aber es ist praktischer, wenn du die Linsk vorher schon richtig markiert hast.

                        2. ich möchte einfach, dass alles was zwischen http:// bzw. www. (o.ä.) und dem nächsten leerzeichen, zeilenumbruch oder textende steht als URL erkannt und von [ url ] und [ /url ] eingeschlossen wird (um genau zu sein soll dass dann so aussehen: [ url=eingegebeneurl ]eingegebeneurl[ /url ]
                        Du willst einfach alle Links durch "richtige" Links ersetzen, nicht? Und wenn jemand zu faul war da das [url] rumzusetzen, dass vor dem rüberlaufen des pregs, was da die Links draus erstellt drumherum setzen, oder?
                        Nur wieso willst du das bei jeder Ausgabe machen??? Speicher das doch einfach sofort so in der DB ab, dass spart auch an Ressourcen des Servers, immerhin musst du das ständig wieder ausgeben lassen...

                        das muss doch irgendwie simpel in besagten zeilen (die in der png) zu machen sein oder?
                        Nein, ist es nicht. Auch, wenn du es bei der Ausgabe machst, würde ich auf eine Kombi von preg_split und preg_replace setzen.
                        Ich denke, dass es mit preg_replace alleine nicht möglich ist, zu erkennen, ob um den Link die [url]-Tags schon sind (und doppelte URL-Tags sind ja auch scheiße, oder?)

                        und ach ja, wie gesagt hab ich schon versucht mich in die regulären ausdrücke einzulesen, hat aber eben nicht hingehaun [/B]
                        Dann solltest du es erneut versuchen, denn die sind eigentlich wirklich praktisch, außerdem hätte ich dann meine kostbare Zeit für mich

                        Ich bin immernoch für die split/replace-Kombi, und ich glaube was anderes wird auch nicht gehen. Ob du das jetzt bei der Ausgabe oder beim Schreiben machst, ist deine Sache. Meine Ansicht ist wohl klar geworden (und das mag jetzt eingebildet klingen, aber ich denke, dass die Umschreibung von Links durch die URL-Tags beim Schreiben passieren sollte, das Austauschen der Links beim Lesen, ansonsten schmiert dir das Skript den Server ab, wenn du viele Besucher bekommst, es ist einfach die bessere Möglichkeit!)

                        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                        Wie man Fragen richtig stellt

                        Kommentar


                        • #13
                          warum einfach wenns auch umständlich geht.
                          jetzt klappts nämlich.

                          wie ich schon am anfang sagte, es funktioniert alles einwandfrei, die urls werden immer zuverlässig erkannt, nur werden sie halt beim ersten komma abgebrochen. das hat für mich den einzigen schluss zugelassen dass das problem behoben werden kann, wenn man die regulären ausdrücke, die ich im png-bild gepostet hab entsprechend angepasst, weil das im gesamten script der einzige bereich is der wirklich http:// urls erkennt und umwandelt.

                          jetzt hab ichs nochmal versucht den stichpunkt aus den ausdrücken zu nehmen (hatte ich ja schon vor längerer zeit mal versucht, und auch gestern wieder), aber diesmal hab ich ihn aus beiden ausdrücken genommen, und siehe da: plötzlich gehts.
                          und das OHNE mein komplettes forum auf den kopf zu stellen!

                          @gostgambler: danke für die viele zeit die du dir genommen hast hat mir nur leider nix genützt
                          diese signatur ist nichtssagend...

                          Kommentar


                          • #14
                            Original geschrieben von CrazyChaos
                            @gostgambler: danke für die viele zeit die du dir genommen hast hat mir nur leider nix genützt
                            Also aus denen, die du mir beim ersten Mal vorgesetzt hattest, hatte ich aus beiden die Kommata entfernt -_-

                            Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                            bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                            Wie man Fragen richtig stellt

                            Kommentar

                            Lädt...
                            X