heiner: kleines problem mit reges

hallo forum,

ich steh gerade etwas auf dem schlauch. ich moechte alles aus einem href="..." haben, ausser wenn die zweichenkette zwischen den aufuehrungszeichen das wort "log" enthaelt. aber ich bekomm es nicht hin, ich hoffe es kann mir jemand helfen ;)

  
preg_match_all('/<a[^>]*href=\"([^\"(log)]+)\"[^>]*lightbox[^>]*>/i',$code,$matches);

gruss heiner

  1. Hellihello

    und warum?

    Vielleicht nimmst Du erstmal alle hrefs und sortierst im zweiten Schritt mit strpos die unbrauchbaren aus?

    Aber kannst Du nicht auf die Baumstruktur direkt zugreifen?

    Dank und Gruß,

    frankx

    --
    tryin to multitain  - Globus = Planet != Welt
  2. Was soll ([^"(log)]+) sein?

    1. Hellihello

      Was soll ([^"(log)]+) sein?

      mindestens einmal vorkommendes nicht-'"log', geklammert, also als Teilausdruck wiederzugeben?

      Dank und Gruß,

      frankx

      --
      tryin to multitain  - Globus = Planet != Welt
      1. Was soll ([^"(log)]+) sein?

        mindestens einmal vorkommendes nicht-'"log', geklammert, also als Teilausdruck wiederzugeben?

        In eckigen Klammern?

        1. Hellihello

          Was soll ([^"(log)]+) sein?

          mindestens einmal vorkommendes nicht-'"log', geklammert, also als Teilausdruck wiederzugeben?

          In eckigen Klammern?

          Ist es nicht so, dass Verneinung nur innerhalb eckiger Klammern gilt
          ~^x[^abc|def]~ hieße "Am Anfang ein kleines x, was nicht von "abc" oder "def" gefolgt ist"?

          Also
          xaus wäre ein treffer.
          xabc aber nicht,
          xdef auch nicht.

          Dank und Gruß,

          frankx

          --
          tryin to multitain  - Globus = Planet != Welt
          1. Ist es nicht so, dass Verneinung nur innerhalb eckiger Klammern gilt ... ?

            Die Negierung mit "^"? Doch, ist schon so, aber in eckigen Klammern werden Zeichen definiert, keine Strings. Für negierte Strings gibt es (?!string) und (?<!string).

            ~^x[^abc|def]~ hieße "Am Anfang ein kleines x, was nicht von "abc" oder "def" gefolgt ist"?

            Nein, das hieße am Anfang ein kleines x, was nicht von einem a, b, c, |, d, e oder f gefolgt ist. (Ich bin mir aus dem Kopf nicht ganz sicher aber "|" hat innerhalb von [] glaube ich keine besondere Bedeutung.)

            1. Hellihello

              Die Negierung mit "^"? Doch, ist schon so, aber in eckigen Klammern werden Zeichen definiert, keine Strings. Für negierte Strings gibt es (?!string) und (?<!string).

              ~^x[^abc|def]~ hieße "Am Anfang ein kleines x, was nicht von "abc" oder "def" gefolgt ist"?

              Nein, das hieße am Anfang ein kleines x, was nicht von einem a, b, c, |, d, e oder f gefolgt ist. (Ich bin mir aus dem Kopf nicht ganz sicher aber "|" hat innerhalb von [] glaube ich keine besondere Bedeutung.)

              wikipedia:

              Alternativen [Bearbeiten]

              Man kann alternative Ausdrücke mit dem „|“-Symbol zulassen:
              „ABC|abc“ bedeutet „ABC“ oder „abc“, aber z. B. nicht „Abc“.

              Ein Zeichen aus einer Auswahl [Bearbeiten]

              Mit eckigen Klammern lässt sich eine Zeichenauswahl definieren. Der Ausdruck in eckigen Klammern steht dann für genau ein Zeichen aus dieser Auswahl. Innerhalb dieser Zeichenklassendefinitionen haben einige Symbole andere Bedeutungen als im normalen Kontext. Teilweise ist die Bedeutung eines Symbols sogar davon abhängig, wo es sich innerhalb der Klammern befindet.

              So bedeutet z. B. ein Zirkumflex „^“ am Anfang einer Zeichenklassendefinition, dass die Zeichenklasse negiert/invertiert wird. Steht ein Zirkumflex jedoch irgendwo sonst in der Definition, ist es literal zu verstehen.

              [^a] ein beliebiges Zeichen außer „a“ („^“ am Anfang einer Zeichenklasse negiert selbige)

              und auch:

              (?=Ausdruck) positive look-ahead assertion
              (?!Ausdruck) negative look-ahead assertion
              (?<=Ausdruck) positive look-behind assertion
              (?<!Ausdruck) negative look-behind assertion

              Dank und Gruß,

              frankx

              --
              tryin to multitain  - Globus = Planet != Welt
              1. Hellihello

                und auch:

                (?=Ausdruck) positive look-ahead assertion
                (?!Ausdruck) negative look-ahead assertion
                (?<=Ausdruck) positive look-behind assertion
                (?<!Ausdruck) negative look-behind assertion

                  
                $zeichenkette = "Sportverein";  
                $suchmuster = '/Sport(?!verein)/';  
                preg_match($suchmuster, $zeichenkette, $treffer);  
                var_dump($treffer);  
                  
                // gibt: array(0) {}  
                  
                $zeichenkette = "Sportverein";  
                $suchmuster = '/Sport(?!=verein)/';  
                preg_match($suchmuster, $zeichenkette, $treffer);  
                var_dump($treffer);  
                  
                // gibt: array(1) { [0]=>  string(5) "Sport"}  
                ?>  
                
                

                Hä, ich hätte jetzt gedacht genau umgekehrt.

                Dank und Gruß,

                frankx

                --
                tryin to multitain  - Globus = Planet != Welt
                1. $zeichenkette = "Sportverein";
                  $suchmuster = '/Sport(?!verein)/';
                  preg_match($suchmuster, $zeichenkette, $treffer);
                  var_dump($treffer);

                  // gibt: array(0) {}...

                  
                  >   
                  >   
                  > Hä, ich hätte jetzt gedacht genau umgekehrt.  
                    
                  Ist schon richtig. Paßt auf eine Zeichenkette, die "Sport" enthält, aber kein "verein" danach. Trifft also auf Sportverein nicht zu.
                  
  3. Hallöchen,

    ...ausser wenn die zweichenkette zwischen den aufuehrungszeichen das wort "log" enthaelt.

    Wenn dein vorhandener Code sonst richtig funktioniert - ist es dann nicht einfacher, hinterher aus dem Array, das preg_match_all zurückgibt, alle unerwünschten Einträge zu löschen?

    siehe array_search() (rausfinden, welches Element unerwünscht ist) und array_splice() (Element(e) entfernen)
    MfG
    vaudi