[PHP] Text teilen => Problem HTML Zeichen

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

  • [PHP] Text teilen => Problem HTML Zeichen

    Hi,

    ich will einen Text teilen. An sich kein Problem, wären da nicht die HTML Zeichen.

    Gibt es eine Funktion mit der ich herausfinden kann ob ich mich an Stelle X im String, in einem HTML Zeichen befinde, also z.B. $str[5] = "br />"

    wenns keine gibt müsst ich mir eben ein array mit allen html zeichen erstellen und die Sache so abfragen.

    Ich hoff da gibts ne elegantere Lösung.
    Lurchi ! Lurchi ! Lurchi !

  • #2
    frage: was willst du mit den html-zeichen denn machen?

    peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Mit den HTML Zeichen will ich direkt nichts machen. Ich will aber, dass sie richtig angezeigt werden und ich den Text nicht mitten in einem HTML Zeichen teile.


      Zur Info: Der String kommt aus dem Tiny Editor
      Lurchi ! Lurchi ! Lurchi !

      Kommentar


      • #4
        Warum teilst du nicht anhand eines Leerzeichens welches sich an der entsprechenden Position oder in der Nähe befindet ?
        Oder ist es ok, wenn du ein Wort einfach an irgendeiner Stelle trennst ?

        Kommentar


        • #5
          Das Problem ist dass ein Leerzeichen ja auch in einem HTML Zeichen vorkommen kann. z.B. <br />, in einem img tag, wo auch immer.
          Lurchi ! Lurchi ! Lurchi !

          Kommentar


          • #6
            Zitat von Anbu Beitrag anzeigen
            Gibt es eine Funktion mit der ich herausfinden kann ob ich mich an Stelle X im String, in einem HTML Zeichen befinde, also z.B. $str[5] = "br />"
            Dazu wirst du schon sowas wie einen Parser brauchen.

            Das kann im simpelsten Falle was selbstgeschriebenes sein, das einfach vom Beginn an < und > zählt und schaut, ob du dich an einer Position gerade "ausserhalb" befindest.
            (Und mit sowas wie &nbsp; - also allgemein Entities bzw. anderen Sonderzeichen-Notationen - musst du natürlich auch noch aufpassen.)

            "Fertig" kannst du das ganze auch bekommen - wenn du wohlgeformtes XHTML nutzt, dann kannst du das auch mit den DOM-Methoden von PHP parsen und dir daraus einen DOM-Baum erstellen lassen. Dessen Elemente kannst du dann durchlaufen, und schauen, bei welchen es sich um Textknoten handelt - und dann deine Zählung der Textlänge auf diese beschränken.
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar


            • #7
              danke..
              hmm werd wohl was selbst basteln müssen denn der Tiny gibt mir kein "wohlgeformtes XHTML" zurück
              Lurchi ! Lurchi ! Lurchi !

              Kommentar


              • #8
                Die DOM Klassen von PHP (nicht die DOM-XML Klassen, die sind veraltet), kommen auch ganz gut mit kaputten XHTML/HTML klar –*man muss nur damit rechnen, dass sie versuchen zu reparieren und damit evtl. was kaputt machen.

                Wenn ich das nicht falsch in Erinnerung habe, gibt TinyEdit aber durchaus valides HTML aus … ?!
                [FONT="Helvetica"]twitter.com/unset[/FONT]

                Shitstorm Podcast – Wöchentliches Auskotzen

                Kommentar


                • #9
                  Warum willst du den Text teilen bzw. was hast du mit den einzelnen Teilen vor?
                  Wenn du das Markup gar nicht mehr brauchst, mach vorher einfach ein strip_tags(). Solltest du das Markup noch brauchen, musst du beim Teilen mehr beachten als nur außerhalb eines HTML-Tags zu sein. Du brauchst dann einen Parser, der die gesamte Verschachtelung für dich "aufsammelt", damit du sie beim Teilen nicht zerstörst.

                  Ein Beispiel: <div><h1>Titel</h1><p>Text Text</p><p>Text Text</p></div>

                  Egal wo du das teilst, du machst dabei immer das DIV kaputt. Willst du den Text zweispaltig darstellen oder auf mehrere Seiten verteilen (Paging), musst du das Markup nach der Teilung "reparieren".

                  Falsch:
                  <div><h1>Titel</h1><p>Text Text</p>
                  <p>Text Text</p></div>

                  Richtig:
                  <div><h1>Titel</h1><p>Text Text</p></div>
                  <div><p>Text Text</p></div>

                  Dabei tritt noch ein kleines, aber unlösbares Problem auf: Du musst alle Paramater übernehmen, um die CSS-Formatierung zu erhalten. Wenn nun das DIV eine ID hat, hast du diese ID anschließend zweimal im Dokument und das ist kein valides HTML mehr (in den meisten Browsern funktionierts aber dennoch).

                  Kommentar


                  • #10
                    Zitat von Anbu Beitrag anzeigen
                    Hi,

                    ich will einen Text teilen. An sich kein Problem, wären da nicht die HTML Zeichen.

                    Gibt es eine Funktion mit der ich herausfinden kann ob ich mich an Stelle X im String, in einem HTML Zeichen befinde, also z.B. $str[5] = "br />"
                    PHP-Code:
                    preg_match('/\G[^<>]+(?=<[^>]+>)/'$html_src$matchesFALSE$offset); 
                    Der RegEx "versagt" an zwei Stellen: Am Anfang und am Ende der Datei. Da du aber sicher nicht vor und nach dem html-Element teilen willst, sollte das kein Problem darstellen.

                    Ach, und natürlich ist <[^>]+> stark vereinfacht. Falls du kaputtes HTML damit prüfen willst, muss der Teil umfangreicher gemacht werden.

                    Zitat von onemorenerd Beitrag anzeigen
                    Warum willst du den Text teilen bzw. was hast du mit den einzelnen Teilen vor? ...
                    Möglicherweise will er nur einen Zeilenumbruch einfügen?
                    Zuletzt geändert von fireweasel; 10.06.2009, 23:40.
                    Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                    Kommentar


                    • #11
                      Zitat von fireweasel Beitrag anzeigen
                      Möglicherweise will er nur einen Zeilenumbruch einfügen?
                      Ein DIV drumherum mit entsprechend CSS reicht nicht?

                      Kommentar


                      • #12
                        Zitat von onemorenerd Beitrag anzeigen
                        Ein DIV drumherum mit entsprechend CSS reicht nicht?
                        Zum Darstellen im Browser sicher -- aber es gibt Leute, die möchten Quelltexte gerne formatieren. Damit's schöner aussieht, oder was-weiß-ich-auch-immer ... ;-)
                        Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                        Kommentar


                        • #13
                          Also was ich vor hab:

                          Einen Text aus einem Tiny auf mehrere Divs(keine feste höhe) verteilen.


                          hmm ich werds mal mit den RegExpr probieren.

                          Mit meiner Funktion schaff ichs den Text 2 mal zu teilen. Das dritte mal geht er bis ans ende des textes.

                          PHP-Code:
                          function spilt_text($txt,$i) {
                              
                          $plain_text strip_tags($txt);
                              
                          $lenghth strlen($plain_text);
                              
                          $part floor($lenghth/$i);
                              for(
                          $z=1;$z<=$i;$z++)
                              {
                                  
                          $part = ($part $z)+1;
                                  while(
                          $plain_text[$part] == " " && $part $lenghth)
                                  {
                                      
                          $part++;
                                  }
                                  
                                  
                          $word trim(substr($plain_text,strrpos(substr($plain_text,0,$plain_text[$part]-1),' '),$plain_text[$part]));
                                  
                          $pos[] = stripos(substr($txt,$part), $word) + strlen(substr($txt,0,$part));
                              }
                              return 
                          $pos;

                          an alle
                          Lurchi ! Lurchi ! Lurchi !

                          Kommentar


                          • #14
                            Zitat von Anbu Beitrag anzeigen
                            Also was ich vor hab:

                            Einen Text aus einem Tiny auf mehrere Divs(keine feste höhe) verteilen.
                            Welche Probleme du damit zu erwarten hast, wenn du das zu primitv angehst, hat onemorenerd ja schon dargelegt.
                            hmm ich werds mal mit den RegExpr probieren.
                            Halte ich dafür für vollkommen ungeeignet.
                            I don't believe in rebirth. Actually, I never did in my whole lives.

                            Kommentar


                            • #15
                              Zitat von Anbu Beitrag anzeigen
                              Also was ich vor hab:

                              Einen Text aus einem Tiny auf mehrere Divs(keine feste höhe) verteilen.
                              Dachte ich mir schon. Das teilen von HTML begegnet mir eigentlich immer nur aus zwei Gründen: Spaltendarstellung wie bei dir oder bei der Erzeugung von Anrisstexten. Letzteres ist einen Tick einfacher zu lösen, weil man am Ende nur alle Tags wieder schließen muss. Du musst diese Tags in der nächsten Spalte aber auch wieder aufmachen. Das ist deswegen schwieriger, weil du die Parameter der Tags mitschleppen musst (zumindest Id und Class fürs CSS).

                              Falls die Spalten bei der Anzeige ungefähr gleich lang werden sollen, dann verlege dich lieber gleich auf eine clientseitige Lösung mit Javascript.

                              Kommentar

                              Lädt...
                              X