Rolf Rost: Knifflige RegEx

hi,

zu später Stunde (so der Oldy) noch eine Nuss:

Es gibt einen String wie folgt

$html = "<html> html </html>";

und einen weiteren String

$x = "html";

$html soll nun mit $x so behandelt werden dass
<html> #html# </html>

dabei herauskommt.

Ein
$html =~ s/$x/#$x#/g; # mein erster Versuch
ergibt
<#html#> #html# </#html#>

und zerhaut mir so die richtigen Tags. Wie machen ?

Viele Grüße, Rolf

  1. Hallo Rolf,

    Es gibt einen String wie folgt

    $html = "<html> html </html>";

    und einen weiteren String

    $x = "html";

    $html soll nun mit $x so behandelt werden dass
    <html> #html# </html>

    dabei herauskommt.

    s/(^|[^<])$x($|[^>])/$1#$x#$2/g;

    Gruesse,
     CK

    --
    http://cforum.teamone.de/
    http://wishlist.tetekum.de/
    If God had meant for us to be in the Army, we would have been born with green, baggy skin.
    1. Donnerwetter!

      Hallo Rolf,

      Es gibt einen String wie folgt

      $html = "<html> html </html>";

      und einen weiteren String

      $x = "html";

      $html soll nun mit $x so behandelt werden dass
      <html> #html# </html>

      dabei herauskommt.

      s/(^|[^<])$x($|[^>])/$1#$x#$2/g;

      ein herzliches Dankeschön Christian!

      Viele Grüße, Rolf

      Gruesse,
       CK

      1. hi,

        Donnerwetter!

        Nicht doch ... ich bibbere hier ja schon elend vor mich hin und bin völlig ausgekühlt.

        s/(^|[^<])$x($|[^>])/$1#$x#$2/g;

        Was dir CK hier geschrieben hat, ist sogar verständlich. Nur überlege ich grade, wo und wie eigentlich ein _praktischer_ Einsatz solcher Ausdrücke (und deiner Strings) vorkommen könnte. Hast du mal schnell einen Hinweis, wo, wie, wann und warum das zwingend nötig wird?

        Grüße aus Berlin

        Christoph S.

        1. hi Christoph,

          Donnerwetter!
          Nicht doch ... ich bibbere hier ja schon elend vor mich hin und bin völlig ausgekühlt.

          Mach ein paar Kniebeugen oder nimm einen zur Brust ;-)

          s/(^|[^<])$x($|[^>])/$1#$x#$2/g;
          Was dir CK hier geschrieben hat, ist sogar verständlich. Nur überlege ich grade, wo und wie eigentlich ein _praktischer_ Einsatz solcher Ausdrücke (und deiner Strings) vorkommen könnte. Hast du mal schnell einen Hinweis, wo, wie, wann und warum das zwingend nötig wird?

          Nunja, ich hab eine lokale Suchmaschine und die bringt irgendwelche Results auf bspw. *html* als Suchstring.

          Die Results sind Links auf das SuchmachinenScript selbst, was auch einer Funktion mächtig ist diese Results darzustellen... kurzum: ich will die Worte die im Suchstring vorgekommen sind farbig im Result (in der Übersicht und auch in der Doku selbst) kennzeichnen. Und da wäre es doch fatal wenn einer *html* als Suchbegriff eingegeben hat und der tag <html> geändert würde...

          Thats all.

          Viele Grüße, Rolf

          1. hallo Rolf,

            kurzum: ich will die Worte die im Suchstring vorgekommen sind farbig im Result (in der Übersicht und auch in der Doku selbst) kennzeichnen. Und da wäre es doch fatal wenn einer *html* als Suchbegriff eingegeben hat und der tag <html> geändert würde...

            Einverstanden. Ich bin grade dabei, so ganz langsam zu lernen, daß für Aufgaben, die ich bisher immer mit (teilweise ellenlangen) if/else-Abfragen gelöst habe, RegExpressions eine deutlich effektivere Alternative sein können.

            Grüße zurück

            Christoph S.

          2. Hallo,

            Die Results sind Links auf das SuchmachinenScript selbst, was auch einer Funktion mächtig ist diese Results darzustellen... kurzum: ich will die Worte die im Suchstring vorgekommen sind farbig im Result (in der Übersicht und auch in der Doku selbst) kennzeichnen. Und da wäre es doch fatal wenn einer *html* als Suchbegriff eingegeben hat und der tag <html> geändert würde...

            Und was ist z.B. mit <img src="meinbild.gif"> wenn dann jemand nach bild sucht?
            Ich denke du wärst besser dran, wenn du dich eines Moduls bedienen würdest, welches HTML gescheit parst, um dann auch wirklich nur im Text herumzudoktorn.

            Viele Grüße,

            Stefan

            --
            Lass dir das Tanzen NICHT verbieten
            http://tanzverbot.de
            1. Moin,

              Die Results sind Links auf das SuchmachinenScript selbst, was auch einer Funktion mächtig ist diese Results darzustellen... kurzum: ich will die Worte die im Suchstring vorgekommen sind farbig im Result (in der Übersicht und auch in der Doku selbst) kennzeichnen. Und da wäre es doch fatal wenn einer *html* als Suchbegriff eingegeben hat und der tag <html> geändert würde...

              Und was ist z.B. mit <img src="meinbild.gif"> wenn dann jemand nach bild sucht?

              Kein Problem, das wird gefunden!

              Ich denke du wärst besser dran, wenn du dich eines Moduls bedienen würdest, welches HTML gescheit parst, um dann auch wirklich nur im Text herumzudoktorn.

              Wozu?
              Siehe oben, hab Christians RegEx eben getestet - coole Mucke ;-)

              Viele Grüße, Rolf

              1. Hallo,

                Und was ist z.B. mit <img src="meinbild.gif"> wenn dann jemand nach bild sucht?

                Kein Problem, das wird gefunden!

                Bist du sicher, dass das kein Problem ist? Wenn in einer Seite über einen Image Tag wie oben beschrieben ein Bild eingebunden ist und jemand sucht nun nach "bild", dann sollte doch bei deiner farblichen Hervorhebung folgendes passieren:

                vorher: <img src="meinbild.gif">

                nacher: <img src="mein<span class="hervorgehoben">bild</span>.gif">
                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^    ^^^^^^^

                Und das ist sicher nicht der von dir gewünschte Effekt. Oder etwa doch?

                Viele Grüße,

                Stefan

                --
                Lass dir das Tanzen NICHT verbieten
                http://tanzverbot.de
                1. hi Stefan,

                  vielen Dank für Dein Feedback!

                  also ich selbst halte absolut nichts von Hervorhebungen der Suchbegriffe in den Dokumenten die nach einer erfolgreichen Suche dargestellt werden.

                  Weil: Derjenige der was gesucht hat weiß erstens *nach was* er gesucht hat und klickt sich in ein Dokument. Spätestens nach dem Lesen der 1. Seite soll er zweitens wissen ob es das trifft nach dem er suchte <nocry> UND NICHT ERST NACHDEM ER SEINEN SUCHBEGRIFF FARBIG HERVORGEHOBEN FAND </nocry>.

                  Und auch aus programmiertechnischen Problemen muss ich dieses Feature auf i-netlab verschieben...

                  Und was ist z.B. mit <img src="meinbild.gif"> wenn dann jemand nach bild sucht?

                  Kein Problem, das wird gefunden!

                  Bist du sicher, dass das kein Problem ist? Wenn in einer Seite

                  Jow! Gefunden wirds ;-)

                  Viele Grüße, Rolf

                  1. Hallo,

                    also ich selbst halte absolut nichts von Hervorhebungen der Suchbegriffe in den Dokumenten die nach einer erfolgreichen Suche dargestellt werden.

                    Dann muss ich es wohl ein bisschen durcheinander gebracht haben. Du hast ja weiter oben geschrieben:

                    ich will die Worte die im Suchstring vorgekommen sind farbig im Result (in der Übersicht und auch in der Doku selbst) kennzeichnen. Und da wäre es doch fatal wenn einer *html* als Suchbegriff eingegeben hat und der tag <html> geändert würde...

                    Daher bin ich davon ausgegangen, dass du deine RegExp auf eine komplette HTML Seite anwenden willst. Und in diesem Fall wären da ja noch andere Dinge zu beachten, außer dass der HTML Tag nicht kaputt geht.

                    Was du jetzt genau vorhast ist mir noch nicht so ganz klar, aber ich denke mal du wirst schon wissen, was du tust.

                    Viele Grüße,

                    Stefan

                    --
                    Lass dir das Tanzen NICHT verbieten
                    http://tanzverbot.de
                    1. hi Stefan,

                      sorry, was ich da letztendlich schrieb ist wirklich etwas verwirrend...

                      Was du jetzt genau vorhast ist mir noch nicht so ganz klar, aber ich denke mal du wirst schon wissen, was du tust.

                      Es ist tatsächlich so, dass ich selbst noch nicht weiß ob ich dieses Feature *Suchbegriffe hervorheben* einbauen soll oder nicht. Manche sagen: Tolle Sache, aber ich selbst bin davon eigentlich nicht so begeistert weil: Wenn jemand was gesucht hat sollte er in der Kurzbeschreibung bereits erkennen ob es das Gesuchte ist, und nicht an der Hervorhebung der eingegeben suchbegriffe. Und beim Öffnen eines Doks aus dem Suchergebnis heraus - dito:

                      Ist es das was ich gesucht habe? Ich will das nach dem Lesen der ersten Zeilen wissen und nicht erst wenn ich meine ehemals eingegeben Suchbegriffe farbig hinterlegt sehe.

                      Ich werd mal das Forum fragen...

                      Viele Grüße, Rolf

    2. Hallo CK,

      s/(^|[^<])$x($|[^>])/$1#$x#$2/g;

      die Antwort hatte mal Stil! Kurz und knackig. Ich würde mir sie beinahe auf ein T-Shirt drucken lassen, wenn ich auch nur ansatzweise wüsste, was der Zeichensalat da oben bewirkt :-)

      Gruß,
      _Dirk
      (beeindruckt)

      1. hi Schuer,

        Hallo CK,

        s/(^|[^<])$x($|[^>])/$1#$x#$2/g;

        die Antwort hatte mal Stil!

        wieso hatte? - hat! Preservativ! (oder heists Presens ?? (Gegenwart) )

        Kurz und knackig. Ich würde mir sie beinahe auf ein T-Shirt drucken lassen, wenn ich auch nur ansatzweise wüsste, was der Zeichensalat da oben bewirkt :-)

        Is doch egal, hauptsache tut :-)

        Aber die Idee mit dem T-Shirt finde ich cool...

        Rolf

        1. Hallo,

          Aber die Idee mit dem T-Shirt finde ich cool...

          scheinbar gibt's sowas schon, wie ich erfahren habe. T-Shirts mit Computergewäsch (neulich sah ich "ALT + F4", sehr beliebt auch "STRG + ALT + ENTF") sieht man ja inzwischen immer häufiger.

          Gruß,
          _Dirk

          1. Hallo Schür,

            scheinbar gibt's sowas schon, wie ich erfahren habe. T-Shirts mit
            Computergewäsch (neulich sah ich "ALT + F4", sehr beliebt auch "STRG + ALT +
            ENTF") sieht man ja inzwischen immer häufiger.

            Ähem. Alt+F4 hatte ich in den Geschmacksverirrungen vorigen Jahrhunderts
            tatsächlich mal gekauft. Hüstel. Ich zieh es aber nicht mehr an. ;-)

            Hier: http://www.interhemd.de/altf4.html

            Tim

      2. Hallo Dirk,

        s/(^|[^<])$x($|[^>])/$1#$x#$2/g;

        wenn ich auch nur ansatzweise wüsste, was der Zeichensalat da oben bewirkt :-)

        Du brauchst Dir nur die Fragestellung von Rolf durchzulesen. ;-)

        Viele Grüße,
        Christian

      3. hi _Dirk!

        s/(^|[^<])$x($|[^>])/$1#$x#$2/g;
        die Antwort hatte mal Stil! Kurz und knackig. Ich würde mir sie beinahe auf ein T-Shirt drucken lassen,

        du sagst das so einfach und meinst das wohl nicht wirklich ernst. aber es gibt tatsaechlich leute, die mit sowas auf t-shirts rumlaufen... vor kurzem habe ich gerade wieder gesehen: /(b{2}|[^b]{2})/

        wenn ich auch nur ansatzweise wüsste, was der Zeichensalat da oben bewirkt

        ich versuche dir nun mal _ansatzweise_ dabei zu helfen:
        s/u/v/g heisst soviel wie: ersetze u durch v, sooft du es findest. (dabei steht das s fuer suchen und ersetzen, das g fuer die globale ersetzung)

        spezifizieren wir nun u, also (^|[^<])$x($|[^>]):

        allgemein:
        a|b heisst: a oder b
        ^ steht fuer: textanfang
        $ steht fuer: textende
        [^c] spezifiziert: ein zeichen, dass kein c ist (das dach hat hier also nichts mit dem dach zu tun, welches "textanfang" bedeutet; hier bedeutet das dach eine negation)
        die durch in runde klammern eingeschlossene ausdruecke gefundenen textstuecke werden automatisch gespeichert als $1 (erster durch klammern begrenzter ausdruck), $2 usw. gespeichert. (wird am beispiel gleich klarer)

        (^|[^<]) heisst in etwa: textanfang oder ein zeichen, dass nicht < ist. die runden klammern bedeuten hier: speichere das gefundene in der variable $1.

        entsprechend heisst ($|[^>]) in etwa: textende oder ein zeichen, dass nicht > ist. speichere das gefundene in $2.

        das $x steht nur fuer den inhalt der variable $x.

        somit heisst (^|[^<])$x($|[^>]) suche den inhalt von $x, wobei das zeichen davor (falls eines existiert) kein < sein darf und das zeichen danach (falls eines existiert) kein > sein darf. speichere dabei das zeichen vor $x in $1 und das zeichen nach $x in $2.

        so kommen wir nun zu v, also $1#$x#$2

        das bedeutet, dass sowohl zwischen $1 und $x als auch zwischen $x und $2 eine raute (bzw. ein doppelkreuz) eingefuegt werden soll.

        zusammengesetzt heisst
        s/(^|[^<])$x($|[^>])/$1#$x#$2/g;
        somit in etwa:
        suche den inhalt von $x, wobei das zeichen vor $x (falls eines existiert) kein < sein darf und das zeichen danach (falls eines existiert) kein > sein darf. speichere dabei das zeichen vor $x in $1 und das zeichen nach $x in $2. ersetze den kompletten gefunden ausdruck (also $1$x$2) durch $1#$x#$2.
        diesen vorgang fuehre sooft durch, wie du $x findest.

        oh, mann! perl ist doch saugeil, oder?

        prost
        seth

        ps. habe mir mein geschriebenes jetzt gerade noch mal durchgelesen und bin zu dem schluss gekommen, dass http://www.perldoc.com viel besser und exakter erklaert als ich und zudem mir weniger arbeit bereitet haette. hihi, wie doof ;-)

        1. Hallo Seth,

          (..) und zudem mir weniger arbeit bereitet haette. hihi, wie doof ;-)

          Und SELFHTML hat auch eine kurze Einführung dazu:

          http://selfhtml.teamone.de/cgiperl/sprache/regexpr.htm

          Wobei ich eigentlich glaube, daß Schuer schon weiß, was das ist, nur
          die genaue Syntax nicht entziffern kann, da diese doch sehr verdichtet
          ist. Ein Gefühl, daß mir manchmal vertraut ist. :-)

          Tim

        2. Hallo,

          du sagst das so einfach und meinst das wohl nicht wirklich ernst. aber es gibt tatsaechlich leute, die mit sowas auf t-shirts rumlaufen... vor kurzem habe ich gerade wieder gesehen: /(b{2}|[^b]{2})/

          ist das die Perl-Version der Business-to-Business (B2B) Strategie?

          ich versuche dir nun mal _ansatzweise_ dabei zu helfen:

          ok, ich höre zu...

          s/u/v/g heisst soviel wie: ersetze u durch v, sooft du es findest. (dabei steht das s fuer suchen und ersetzen, das g fuer die globale ersetzung)

          das ist ja noch vnheimlich einfach, behavpte ich

          spezifizieren wir nun u,

          Es ist ein u!

          (..)
          [sehr viel gelesen und versucht zu verstehen]
          (..)

          so kommen wir nun zu v, also $1#$x#$2

          Ja, lass' uns v spezifizieren!

          zusammengesetzt heisst
          s/(^|[^<])$x($|[^>])/$1#$x#$2/g;
          somit in etwa:
          suche den inhalt von $x, wobei das zeichen vor $x (falls eines existiert) kein < sein darf und das zeichen danach (falls eines existiert) kein > sein darf. speichere dabei das zeichen vor $x in $1 und das zeichen nach $x in $2. ersetze den kompletten gefunden ausdruck (also $1$x$2) durch $1#$x#$2.
          diesen vorgang fuehre sooft durch, wie du $x findest.

          hey, das hat CK dann mit Perl aber ziemlich geil komprimiert, wenn ich mal den Einzeiler mit deiner Zusammenfassung vergleiche. Wobei das Ergebnis mit Winzip sicherlich sehr ähnlich ausgesehen hätte :-)

          oh, mann! perl ist doch saugeil, oder?

          Ja, ich kann vor Begeisterung kaum meinen Stuhl halten! :-) Aber danke, dass du dir die Mühe gemacht hast, es mir zu erklären.

          Gruß,
          _Dirk

          1. Hallo Schuer,

            zunaechst mal: vielen Dank fuer dein Lob, aber es
            war vollkommen unberechtigt. Das ist ein sehr
            einfacher RegEx gewesen.

            du sagst das so einfach und meinst das wohl
            nicht wirklich ernst. aber es gibt
            tatsaechlich leute, die mit sowas auf
            t-shirts rumlaufen... vor kurzem habe ich
            gerade wieder gesehen: /(b{2}|[^b]{2})/

            ist das die Perl-Version der
            Business-to-Business (B2B) Strategie?

            Nein, das heisst in gesprochenem Englisch:

            two b or not two b. Das klingt wie to be or not
            to be. Also: Sein oder nicht sein.

            Gruesse,
             CK

            --
            http://cforum.teamone.de/
            http://wishlist.tetekum.de/
            If God had meant for us to be in the Army, we would have been born with green, baggy skin.
            1. Hallo CK,

              zunaechst mal: vielen Dank fuer dein Lob, aber es
              war vollkommen unberechtigt. Das ist ein sehr
              einfacher RegEx gewesen.

              das Lob bezog sich auch eigentlich eher auf die prägnante Schlichtheit deiner Hallo-blubb-Ciao-Aussage, mit der du nur 4 Minuten nach Eröffnung des Threads deinen Einzeiler auf den Tisch knalltest.

              Für mich beinahe so, als hättest du gesagt:

              Hallo,

              42

              Gruesse,
               CK

              two b or not two b. Das klingt wie to be or not
              to be. Also: Sein oder nicht sein.

              Informatikerhumor, ich verstehe ;-)

              Gruß,
              _Dirk

            2. Hallo Christian,

              gerade wieder gesehen: /(b{2}|[^b]{2})/
              Nein, das heisst in gesprochenem Englisch:
              two b or not two b.

              tut es das wirklich?

              Ist die Bindung zwischen "not" und "b" nicht stärker als die zum "two"?

              Viele Grüße
                    Michael

              --
              T'Pol: I apologize if I acted inappropriately.
              V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
              (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)
              Auch diese Signatur wird an korrekt konfigurierte Browser gzip-komprimiert übertragen.
              1. Hallo Michael,

                Ist die Bindung zwischen "not" und "b" nicht stärker als
                die zum "two"?

                Zu meinem Verblueffen muss ich verststellen, dass du recht
                hast. Ich hab da noch gar nicht drueber nachgedacht ;) Hihi,
                das finde ich gut: damit machen sich alle, die dieses T-Shirt
                tragen, laecherlich.

                Gruesse,
                 CK

                --
                http://cforum.teamone.de/
                http://wishlist.tetekum.de/
                Murphy's Law of Research:
                        Enough research will tend to support your theory.
                1. hi!

                  Ist die Bindung zwischen "not" und "b" nicht stärker als
                  die zum "two"?
                  das finde ich gut: damit machen sich alle, die dieses T-Shirt
                  tragen, laecherlich.

                  tun sie imho nicht. (nein, ich besitze ein solches t-shirt nicht ;-) )

                  kunst muss nicht exakt sein.

                  abgesehn davon ist der "richtige" regulaere ausdruck fuer "zwei b oder nicht zwei b" tautologisch und deswegen relativ sinnfrei. und sinnfreiheit wollen die t-shirt-traeger Shakespeares werken doch bestimmt nicht unterstellen. ;-)

                  prost
                  seth

          2. Hi,

            du sagst das so einfach und meinst das wohl nicht wirklich ernst. aber es gibt tatsaechlich leute, die mit sowas auf t-shirts rumlaufen... vor kurzem habe ich gerade wieder gesehen: /(b{2}|[^b]{2})/

            ist das die Perl-Version der Business-to-Business (B2B) Strategie?

            Nein. Shakespeare, Hamlet.
            To be or not to be
            (that is the question. Whether 'tis nobler in the mind to suffer...)

            spezifizieren wir nun u,
            Es ist ein u!

            Bist Du sicher, daß es kein X ist ;-)

            cu,
            Andreas

            --
            Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
            http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
    3. Hallo Rolf,

      Es gibt einen String wie folgt

      $html = "<html> html </html>";

      und einen weiteren String

      $x = "html";

      $html soll nun mit $x so behandelt werden dass
      <html> #html# </html>

      dabei herauskommt.

      anstatt  s/(^|[^<])$x($|[^>])/$1#$x#$2/g;
      hätte es auch sicher $html = s/ $x / #$x# /g;
      getan.

      1. Hallo hilker,

        anstatt  s/(^|[^<])$x($|[^>])/$1#$x#$2/g;
        hätte es auch sicher $html = s/ $x / #$x# /g;
        getan.

        Nein.
        Was ist, wenn der String nur ein Teil eines Wortes ist? Oder
        was, wenn er am Anfang des Textes steht? Oder am Ende?

        Gruesse,
         CK

        --
        http://cforum.teamone.de/
        http://wishlist.tetekum.de/
        If God had meant for us to be in the Army, we would have been born with green, baggy skin.