Danny: RegEx-Problem

Hallo,

es soll ein Teilstring in Anführungszeichen ermittelt werden. Zugelassen sind " und ' wobei innerhalb der Anführungszeichen diese auch maskiert vorkommen können. Bsp:

<a href="foo.html" title="das ist ein "Test" id="test">

Wie gebe ich dem RegEx-Interpreter zu verstehen, das der Teil von " oder ' bis zum nächsten solchen Anführungszeichen incl. maskierter Anführungszeichen gespeichert werden soll ?

Mein Ansatz:

(\s+)  # 1. Leerzeichen vor Attrname (muß min. 1)
(\S+)  # 2. Attrname
(\s*)  # 3. Leerzeichen vor Gleichzeichen (kann)
=
(\s*)  # 4. Leerzeichen vor Anführungszeichen (kann)
(["'])?  # 5. Anführungszeichen (kann)
(?(5) # wenn Anführungszeichen
  (.*?)\5  # dann Attrwert = Zeichenkette bis zum nächsten Anführungszeichen
  | ([^\s>]+)  # sonst Attrwert = Zeichenkette bis zum nächsten Leerzeichen, bzw. Tagende

Das Problem:

(.*?)\5
Damit wird ja der kürzeste Weg gewählt, also nur z.B. " bis " gesucht und nicht von " über " bis "
Lasse ich das Fragezeichen jedoch weg, funktioniert es auch nicht, die einzelnen Attribute werden nicht mehr einzeln erkannt...

Trotz nachschlagen im PHP-Manual komme ich nicht drauf.

MfG

  1. hi,

    in perl würde das so ausschauen:

    $string = qq{dfaksdjföaksjdfaöskdf lsk dfkjd f klsdf  anf "d asödf "jsdflajsdf" öklsadfj sdfj" end werjj wer wer wjer};

    $string =~ s/"(.*)"//;
               ^ ist in php die funktion ereg_replace
    print $1;

    php-regex:
    http://www.phpfreaks.com/tutorials/52/0.php
    http://www.phpfreaks.com/tutorials/63/0.php

    lg, lois

    1. $string =~ s/"(.*)"//;
                 ^ ist in php die funktion ereg_replace
      print $1;

      um $1 verwenden zu können können musst du vielleicht statten ereg_replace preg_replace verwenden (perl compatibel - ist etwas her bei mir mit php)
      $a=preg_replace('/"(.*)"/','');
      $string = $1;

      1. Hi,

        danke für den Tipp! Das funktioniert aber so nicht, eben weil " auch in der Zeichenfolge " vorkommt und der komplette Bereich von " über " bis " gesucht wird... Außerdem kann ich auch nicht nach " und folgendem Leerzeichen als Ende suchen, womit das Problem evtl. umgangen werden könnte, weil ja auch mal z.B. "foo" bar" vorkommmen kann. Eine Lösung wäre die Zeichenfolge " durch &quote; temporär zu ersetzen oder ein paar String-Funktionen zu benutzen, was ich auch gleich mal ausprobieren werde.

        MfG

  2. Hallo Danny,

    es soll ein Teilstring in Anführungszeichen ermittelt werden. Zugelassen sind " und ' wobei innerhalb der Anführungszeichen diese auch maskiert vorkommen können. Bsp:

    <a href="foo.html" title="das ist ein "Test" id="test">

    ich habe mal ein wenig rumgespielt. Jetzt bin ich aber zu müde, ab hier kannst du weiter machen.

    <?php  error_reporting(E_ALL);
    header("Content-type: text/plain ");
    define ( 'nl' , "\n" ) ;
    // ---------------------------------

    $html ='<a href = "foo.html" title= "das \\ist ein \"Test" id ="test" blub = "" >' ;
    echo $html . nl.nl ;

    $pattern = '#(\S+)\s*=\s*(""|"\\\\"|"[^"\\]"|"[^"].*?[^\\]")#s';
    echo '$pattern = '.$pattern .nl.nl ;

    preg_match_all ($pattern , $html , $matches ) ;

    print_r ( $matches );

    /* Ausgabe
    Array
    (
        [0] => Array
            (
                [0] => href = "foo.html"
                [1] => title= "das \ist ein "Test"
                [2] => id ="test"
                [3] => blub = ""
            )

    [1] => Array
            (
                [0] => href
                [1] => title
                [2] => id
                [3] => blub
            )

    [2] => Array
            (
                [0] => "foo.html"
                [1] => "das \ist ein "Test"
                [2] => "test"
                [3] => ""
            )

    )

    */
    ?>

    Gruß
      Christian

    1. Cool! Tausend Dank! :)