Jasper: RegEx für Style-Attribut

Hallo !

Auf der verzweifelten Suche nach einem Regulären Ausdruck, der bestimmt schon irgendwann von irgendwem erdacht wurde, bin ich wieder mal hier gelandet. Letzte Station SelfHTML-Forum ;)

Ich möchte in PHP die Eigenschaften eines HTML Style-Attributs mittels Regex auslesen.

style="display:none; float:left;"
=> array("display" => "none", "float:left")

Das Problem ist dabei die Heterogenität der Schreibweisen, da alles ungefiltert geparsed wird. Es sollte also allgemein laufen auch für

display: none;
display: 'none';
display:'none';
bzw. style="display:none" (ohne Semikolon bei nur einer Eigenschaft)

hat da jmd. vielleicht eine Lösung parat?

thx in advance
Jasper

  1. Hi,

    Ich möchte in PHP die Eigenschaften eines HTML Style-Attributs mittels Regex auslesen.

    warum möchtest Du eine Parsing-Aufgabe mittels einer dafür ungeeigneten Technik erfüllen?

    Das Problem ist dabei die Heterogenität der Schreibweisen, da alles ungefiltert geparsed wird. Es sollte also allgemein laufen auch für

    content: 'Das hier: 'var foo = "bar";' ist eine Variablen-Deklaration.';

    hat da jmd. vielleicht eine Lösung parat?

    Ich kann Dir garantieren, dass niemand eine Lösung parat hat. Regular Expressions können hier allerhöchstens ein Hilfsmittel sein, niemals jedoch die Lösung.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. warum möchtest Du eine Parsing-Aufgabe mittels einer dafür ungeeigneten Technik erfüllen?

      Es handelt sich um eine Template-Engine, eine bessere " Technik " als PHP für das Parsing vor der Ausgabe als HTML kenne ich nicht.

      content: 'Das hier: 'var foo = "bar";' ist eine Variablen-Deklaration.';

      diese Bsp. ist mir nicht ganz klar...

      Ich kann Dir garantieren, dass niemand eine Lösung parat hat. Regular Expressions können hier allerhöchstens ein Hilfsmittel sein, niemals jedoch die Lösung.

      für das Auslesen von Tag-Attributen habe ich folgende zwei Schritte:

      $atts_string = preg_replace('/([\w]*)=([^"][\w]*)([\W|>]?)/', '$1="$2"$3', $atts_string);

      preg_match_all('/([\w]*)="(.*?)"/', $atts_string, $matches);

      das sollte doch auch für single quoted Style-Eigenschaften möglich sein.

      1. Hi,

        Es handelt sich um eine Template-Engine, eine bessere " Technik " als PHP für das Parsing vor der Ausgabe als HTML kenne ich nicht.

        ja, bitte. PHP bietet viele Möglichkeiten.

        content: 'Das hier: 'var foo = "bar";' ist eine Variablen-Deklaration.';
        diese Bsp. ist mir nicht ganz klar...

        Wenn Du eine RegExp hast, die die von Dir genannten und das oben stehende Beispiel korrekt erkennt, dann gebe ich Dir ein Beispiel, bei dem die RegExp kläglich versagt. Egal wie oft. Es ist absolut unmöglich, dass eine einzige Regular Expression alle möglichen Fälle abdeckt - selbst wenn man diese nur auf validen Code beschränkt.

        für das Auslesen von Tag-Attributen habe ich folgende zwei Schritte:
        $atts_string = preg_replace('/([\w]*)=([^"][\w]*)([\W|>]?)/', '$1="$2"$3', $atts_string);

        Na prima, schon bei <foo qaz = bar> versagt dies, von haufenweise absolut gültiger Werte ganz zu schweigen.

        preg_match_all('/([\w]*)="(.*?)"/', $atts_string, $matches);

        Jag da mal ein <p title='Ein "sch&ouml;ner" Absatz'> durch.

        das sollte doch auch für single quoted Style-Eigenschaften möglich sein.

        CSS-Syntax ist noch sehr viel komplexer als die von HTML, und schon das ist ganz augenscheinlich schwerer, als Du es erkannt hast. Regular Expressions sind *nicht* in der Lage, Strukturen zu analysieren.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. ja, bitte. PHP bietet viele Möglichkeiten.

          ?? Habe ich vorher von etwas anderem als PHP gesprochen?

          Na prima, schon bei <foo qaz = bar> versagt dies, von haufenweise absolut gültiger Werte ganz zu schweigen.

          Jag da mal ein <p title='Ein "sch&ouml;ner" Absatz'> durch.

          Das Ziel ist nicht Phantasie-Kombinationen zu berücksichtigen, sondern gängige Schreibweisen, wie vorher erläutert. Sobald diese vier oder fünf Varianten abgedeckt werden können, bin ich zufrieden.

          Gruß
          Jasper

    2. Servus,

      content: 'Das hier: 'var foo = "bar";' ist eine Variablen-Deklaration.';

      das wird innerhalb eines 'style=""'-Elements als gültige Syntax
      interpretiert? Ich war der Ansicht, zu 'content' gehöre immer
      Elementname und Pseudoklasse ('p:before { content: etc.').

      Grüsse

  2. mal aus reiner neugier, was hast du damit am ende vor? das man am ende in nem interface auswählen kann, was man angezeigt haben will und was nicht?
    davon abgesehn, glaube ich nicht das es soo schwer ist. kann mich irren, aber es gibt in der regel schonmal keine sonderzeichen bei den "werteangaben" der css sachen, ist ja alles englisch...

    display: none;
    display: 'none';
    display:'none';
    bzw. style="display:none"

    =>

    1. auslesen von "display:" bis entweder ; oder stringende - was halt früher erreicht ist.
      somit hast du schonmal die wertangabe, aus

    display: none;
    display: 'none';
    display:'none';

    wird

    none
     'none'
    'none'
    =>einfach leerzeichen und ' mit "nichts" ersetzen, sprich entfernen.

    schwups, da haste deinen wert. ka ob ich da was falsch gemacht habe, aber ich sehe da kein allzu großes problem.

    Jag da mal ein <p title='Ein "sch&ouml;ner" Absatz'> durch.

    gehört title zu css? und vor allem, solange es nur um display geht ist das eh unrelevant, und es würde mich auch nicht wundern, wenn man auch so die werte einzelner attribute (?) heruasbekommt, die haben immer n bestimmtes muster! (irgendwie muss es der browser ja auch parsen?)

    1. Nachtrag: content: 'Das hier: 'var foo = "bar";' ist eine Variablen-Deklaration.';
      ja, der content kram macht das ganze natürlich komplizierter, aber irgendwie wirds schon gehn und solange du nur den wert einer bestimmten eigenschaft willst...