[REGEX] Umbruch erzwingen, aber nicht in Tags!

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

  • [REGEX] Umbruch erzwingen, aber nicht in Tags!

    Hallo!

    Es geht darum, dass ich zu lange Wörter unterbrechen will, damit sie nicht die Seite sprengen. Ich bin der Verzweiflung schon ziemlich nahe, da man einfach nichts funktionierendes findet. Ich suche bereits seit Stunden per Google und auch hier habe ich NICHTS funktionierendes gefunden. Aber so schwer dürfte das doch eigentlich nicht sein...

    Ich habe bereits einen Regex der mir zu lange Wörter problemlos unterbricht:

    Code:
    $text		= preg_replace('/([^\s\<\>]{50,50})/', '\1 ', $text);
    ...allerding macht er dies auch in Tags, wie zB. <a href=....>. Dies ist natürlich destruktiv, da die Links dadurch kaputt gehen. Also habe ich weiter gesucht und einen Regex gefunden, der etwas ersetzen kann, dies aber nur außerhalb von Tags macht.

    Code:
    $text		= preg_replace("/((<[^>]*)|$s)/ie", '"\2"=="\1"? "\1":"<b>\1</b>"', $text);
    Funktioniert auch Bestens, nur will ich ja nichts ersetzen, sondern einfach nur außerhalb von Tags, zu lange Wörter umbrechen.

    Meine Versuche die beiden Regexe miteinander zu verbinden endeten kläglich in zahllosen Fehlermeldungen.

    Ich wäre sehr glücklich, wenn sich jemand meiner erbarmen könnte und diesem Problem mal ein Ende setzt. Und bitte nicht auf die Suchfunktion verweisen, wie gesagt da gibt es leider nichts funktionierendes oder passendes :/

    Mit freundlichen Grüßen
    Smiller

  • #2
    Regex sind kein so einfaches Thema. Natürlich ist es möglich lange Wörter nur außerhalb von Tags zu unterbrechen. Nur Du wirst da das Problem haben, dass Du warscheinlich all diese Fälle definieren musst. Denn ein Tag ist ja z.b. auch "<p></p>", oder "<td></td>" und innerhalb dieses Tags können durchaus lange Wörter stehen, die Du unterbrechen willst.

    Wieso vermeidest Du nicht die langen Wörter von vornherein bzw. wozu brauchst Du genau diese Regex Funktionalität?

    Kommentar


    • #3
      Danke für die Antwort Gott_R,

      aber was zwischen <b> und </b> steht soll ja auch umgebrochen werden (bzw. Leerzeichen), nur was in den Tags steht nicht, also ...

      <klfjfnkcjgsdflhnsdganödgnadfknhsdnh> oder <a href="blabla">

      also muss der Regex nur die Bereiche zw. "<" und ">" auslassen.

      Diese Funktionalität brauche ich, damit User mit langen Worten nicht das Design sprengen können. Ich habe ein ziemlich schmales Layout.

      Mit freundlichen Grüßen
      Smiller

      Kommentar


      • #4
        Original geschrieben von Smiller
        also muss der Regex nur die Bereiche zw. "<" und ">" auslassen.
        evtl. hilft dir da http://www.php-resource.de/forum/sho...threadid=43775 weiter.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          Hallo wahsaga,

          ich habe mir dieses Topic durchgelesen und mich auch mal zu den assertions informiert. Leider kann ich dies nicht auf mein Problem übertragen. Vielleicht liegt es ja an meiner Unfähigkeit.

          Wenn ich das richtig verstehe unterscheiden sich unsere Probleme folgendermaßen:
          - ich suche kein bestimmtes Wort sondern ein zu langes beliebiges Wort
          - ich will es nicht nur finden sondern auch etwas damit machen (umbrechen)
          - ich will es nur außerhalb von "<" und ">" finden

          Über eine schmale regex-Lösung wäre ich sehr glücklich.

          Mit freundlichen Grüßen
          Smiller

          Kommentar


          • #6
            Original geschrieben von Smiller
            Wenn ich das richtig verstehe unterscheiden sich unsere Probleme folgendermaßen:
            ich sehe da keine großen unterschiede.

            - ich suche kein bestimmtes Wort sondern ein zu langes beliebiges Wort
            und wie definierst du "zu langes wort"?
            ich würde sagen, das sind genau x (wort-)zeichen, und danach nochmal beliebig viele (wort-)zeichen.

            - ich will es nicht nur finden sondern auch etwas damit machen (umbrechen)
            "was damit machen" wollte ich ja auch.

            - ich will es nur außerhalb von "<" und ">" finden
            und ich nur außerhalb von [ und ]. diese transferleistung ist ja nun nicht besonders anspruchsvoll ...
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar


            • #7
              Re: [REGEX] Umbruch erzwingen, aber nicht in Tags!

              Was du in deinem Beispiel gemacht hast, ist doch quasi das selbe wie in meinem obigen Beispiel.

              ein Regex, der etwas ersetzen kann, dies aber nur außerhalb von Tags macht.

              Code:
              $s = "blog";
              $text		= preg_replace("/((\[[^\]]*)|$s)/ie", '"\2"=="\1"? "\1":"[h]\1[/h]"', $text);
              Angepasst!
              Ich bekomme es halt einfach nicht hin, dies auf mein eigentliches Problem anzuwenden (die zu langen Wörter, >50 Zeichen), deswegen habe ich ja auf eure Hilfe gehofft. Wenn es denn so "einfach" ist, dann sag mir doch bitte was ich ändern muss.

              Mit freundlichen Grüßen
              Smiller

              Kommentar


              • #8
                Re: Re: [REGEX] Umbruch erzwingen, aber nicht in Tags!

                Original geschrieben von Smiller
                Ich bekomme es halt einfach nicht hin, dies auf mein eigentliches Problem anzuwenden (die zu langen Wörter, >50 Zeichen)
                dann zeig bitte deinen versuch her,
                und wie definierst du "zu langes wort"?
                ich würde sagen, das sind genau x (wort-)zeichen, und danach nochmal beliebig viele (wort-)zeichen
                in regex umzusetzen.
                I don't believe in rebirth. Actually, I never did in my whole lives.

                Kommentar


                • #9
                  Nach meinem Verständnis dürfte er in meinem ersten Beispiel ja garnicht innerhalb der "<" und ">" umbrechen, aber er macht es trotzdem. Das ist schon der Punkt wo ich "hänge". Und wenn ich dann die Suchepattern aus Bsp. 2 in 1 einsetze:

                  Code:
                  	
                  $text		= preg_replace('/(<[^>]*{50,50})/', '\1 ', $text);
                  erhalte ich
                  Warning: Compilation failed: nothing to repeat at offset 13 in E:\www\webroot\v5\includes\function.php on line 484

                  Und bei


                  Code:
                  	
                  $text		= preg_replace('/((<[^>]*){50,50})/', '\1 ', $text);
                  Bricht er nix um.

                  Kommentar


                  • #10
                    Tu mal im obigen Beispiel das "*" entfernen. Denn aufgrund dieses Steuerzeichens erhälst Du die Fehlermeldung.

                    Kommentar


                    • #11
                      Original geschrieben von Smiller
                      Warning: Compilation failed: nothing to repeat at offset 13 in E:\www\webroot\v5\includes\function.php on line 484
                      es gibt ja an der stelle auch nichts zu wiederholen - weil vor deiner {50,50} klammer keine gültige zeichenklasse steht.
                      I don't believe in rebirth. Actually, I never did in my whole lives.

                      Kommentar


                      • #12
                        Wenn ich das "*" entferne, ist die Fehlermeldung weg, aber Leerzeichen werden auch keine eingefügt


                        Um nochmal dieses Beispiel zu analysieren:
                        Code:
                        $text		= preg_replace('/([^\s\<\>]{50,50})/', '\1 ', $text);
                        Gesucht wird nach Wörtern, die 50 Zeichen lang sind, keine whitespaces, sowie kein "Tag auf" und "Tag zu" enthalten. Wieso verdammt nochmal geht das denn nicht?

                        OK, warum das nicht funtzt weiß ich jetzt!...
                        <a href="http://www.dies-ist-ein-ganz-langer-link.de" target="_blank">

                        Das href-Konstrukt steht ja alleine da, also trennt er mitten in der URL ab :/ ... also muss es anders gehen.

                        Analyse des 2ten Beispiels...

                        Code:
                        $s ="test";
                        $text		= preg_replace("/((<[^>]*)|$s)/ie", '"\2"=="\1"? "\1":"<b>\1</b>"', $text);
                        (<[^>]*) ... Wort fängt mit "<" an, danach darf alles kommen, außer ">", und dann beliebig viele Zeichen... bei <a href="... trifft dies doch nur auf "<a" zu, oder?

                        $s ... sucht nach dem Wort "test"

                        '"\2"=="\1" ... vergleicht "<a" mit "test" -> false, also gibt er <b><a</b> aus? Neee, stimmt ja nicht. Also was liefert denn $s (\2) zurück?
                        Zuletzt geändert von Smiller; 22.09.2004, 17:48.

                        Kommentar


                        • #13
                          Also ich glaube ich habe jetzt einen ersten Erfolg gelandet....

                          Code:
                          $text		= preg_replace("/((<[^>]*)|([^\s.]{20,20}))/ie", '"\2"=="\1"? "\1":"\1 "', $text);
                          Es funktioniert soweit einwandfrei. Komischerweise bricht er aber das was zwischen <a href="xyz"> und </a> steht nur alle 50 Zeichen um? Ist nicht so tragisch, aber warum das so ist und ob diese Lösung sauber ist würde mich noch interessieren.

                          Kommentar


                          • #14
                            hmm,

                            der reguläre ausdruck
                            Code:
                            @([a-zäöüß]{50})(?![^<]*>)@is
                            findet 50 buchstaben, die nicht innerhalb von tags stehen ... (naja ...) unter der voraussetzung, daß u.a. < und > als &amp;lt; und &amp;gt; verwendet werden, wenn es sich dabei um normale zeichen und nicht tag-grenzen handelt ...

                            wenn du als ersatz für preg_replace
                            Code:
                            '\1 '
                            verwendest, solltest du die gewünschte trennung erhalten ...

                            http://pcre.nophia.de/evaluate/e3706...dex.php#output
                            schaus dir mal an, zur verdeutlichung hab ich als ersatz mal ______ verwendet, (außerdem verschluckt das teil leerzeichen am ende des replacements, kann keine zeilenumbrüche umsetzen, aber das nur btw)

                            aber soetwas wolltest du doch?

                            edit: achso, ok ....
                            Zuletzt geändert von derHund; 22.09.2004, 18:10.
                            Die Zeit hat ihre Kinder längst gefressen

                            Kommentar


                            • #15
                              Vielen Dank für Deine Mühe.

                              Deine Lösung funktioniert eigendlich genauso, mit dem Unterschied, dass sie alles was zwischen <a ..> und </a> steht garnicht trennt. Das ist natürlich nicht so gut. Ansonsten sieht sie schlanker aus, als meine (Not)lösung.

                              edit:
                              Problem gelöst:

                              Code:
                              $text = preg_replace("@([^\s*?]{20})(?![^<]*>)@is", '\1 ', $text);
                              Vielen Dank nochmal, für die Hilfe und Hilfe zur Selbsthilfe

                              Mit freundlichen Grüßen
                              Smiller
                              Zuletzt geändert von Smiller; 22.09.2004, 18:24.

                              Kommentar

                              Lädt...
                              X