preg_match ist Greedy, obwohl der Syntax Ungreedy ist

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

  • preg_match ist Greedy, obwohl der Syntax Ungreedy ist

    Hi,

    ich habe ein Problem mit diesem Syntax:
    PHP-Code:
        if (preg_match('#<a(.*?href=("|\')' $www '[/ ]?("|\').*?)>.*?</a>#is'$content$matches)) { 
    das gleiche hier:
    PHP-Code:
        if (preg_match('#<a(.*href=("|\')' $www '[/ ]?("|\').*)>.*</a>#Uis'$content$matches)) { 
    Und zwar sucht er sich den ersten <a und geht dann solange weiter bis der $www gefunden wurde.

    Das passiert aber komischerweise nur, wenn im $content erst ein <a href=" kommt und dann der eigentliche $www mit a href=' verlinkt wurde.

    Hier der vollständige Test-Code:
    PHP-Code:
    $content '<a href="/">Logo</a>
    Content<br />
    <a href=\'http://domain.de\'>Link</a>
    Footer<br />'
    ;
    $website 'http://domain.de';

    $www str_replace('.''\.'$website);
    $matches = array();
    if (
    preg_match('#<a(.*?href=("|\')' $www '[/ ]?("|\').*?)>.*?</a>#is'$content$matches)) {
            
    print_r($matches);

    Ausgabe $matches:
    PHP-Code:
    Array
    (
        [
    0] => <a href="/">Logo</a>
    Content<br />
    <
    a href='http://domain.de'>Link</a>
        [
    1] =>  href="/">Logo</a>
    Content<br />
    <
    a href='http://domain.de'
        
    [2] => '
        [3] => '

    Ich habe doch extra ungreedy zwischen <a und href= angegeben, also warum verhält er sich trotzdem greedy?

    EDIT:
    Auch diese Variante gibt $matches[1] wie zuvor aus:
    PHP-Code:
    if (preg_match("#<a(.*href='" $www "[/ ]?'.*)>.*</a>#Uis"$content$matches)) { 
    Zuletzt geändert von mgutt; 03.12.2008, 20:37.
    mein Honda Forum | meine Scripte

  • #2
    nach dem <a nicht mit .* weitermachen sondern mit [^<]*
    TBT

    Die zwei wichtigsten Regeln für eine berufliche Karriere:
    1. Verrate niemals alles was du weißt!


    PHP 2 AllPatrizier II Browsergame

    Kommentar


    • #3
      Gut ist eine Lösung (erstmal danke soweit), aber ich verstehe nicht warum mein Syntax Greedy ist?
      mein Honda Forum | meine Scripte

      Kommentar


      • #4
        weil beim ersten <a anfängt, was er findet, ab denn ist der Ausdruck ungreedy.
        Ungreedy bedeutet nicht, das er den Anfang auch weit möglichst nach hinten schiebt, sondern nur, dass er den Ausdruck frühest möglich beendet.
        TBT

        Die zwei wichtigsten Regeln für eine berufliche Karriere:
        1. Verrate niemals alles was du weißt!


        PHP 2 AllPatrizier II Browsergame

        Kommentar


        • #5
          Ok, geht also nur vorwärts nicht rückwärts. Wieder was gelernt. Das erklärt dann auch warum ich den NOT-Part nur am Anfang setzen muss.

          Nochmals Danke!
          mein Honda Forum | meine Scripte

          Kommentar

          Lädt...
          X