preg_match ist Greedy, obwohl der Syntax Ungreedy ist

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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)) { 
    Last edited by mgutt; 03-12-2008, 19: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

    Comment


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

      Comment


      • #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

        Comment


        • #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

          Comment

          Working...
          X