kostenloser Webspace werbefrei: lima-city


Regex Pattern mit String Ausschluss

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    grgiko

    grgiko hat kostenlosen Webspace.

    Hallo

    ich möchte alle Links aus einer Seite tag/auslese">auslesen, die auf eine Datei im Ordner reviews/ zeigen

    leider sind die Links jeweils 2x vorhanden, einmal mit dem Link-Text = "der Titel des Review"
    und nocheinmal immer mit dem Link-Text = "Reviews"

    BSP:
    $content = '
    <p>... <a href="reviews/aaa.php">AAA</a> ... <a href="reviews/aaa.php">Reviews</a> ... </p>
    <p>... <a href="reviews/bbb.php">BBB</a> ... <a href="reviews/bbb.php">Reviews</a> ... </p>
    <p>... <a href="reviews/ccc.php">CCC</a> ... <a href="reviews/ccc.php">Reviews</a> ... </p>
    ';


    mit folgendem Pattern bekomme ich immer "beide" links

    $pattern = '#<a[^>]+href\="reviews/(.*)"[^>]*>(.*)</a>#Umsi';
    preg_match_all($pattern, $content, $matches, PREG_SET_ORDER); 
    
    print "<pre>\n"; 
    print_r($matches);
    print "</pre>\n";


    ich will aber nur den einen (ersten), bei dem der Link-Text nicht "Reviews" ist

    Was muss in den Pattern rein, damit ich jeweils nur den ersten Link bekomme,
    ..... also alle Links ausschließen, die als Link-Text "Reviews" haben

    irgend eine "wenn nicht" Bedingung zwichen <a> und </a> .... da wo jetzt *>(.*)</a> steht

    wie kann ich den Pattern so einstellen, das Links wie <a href="reviews/bbb.php">Reviews</a>
    keine Treffer sind, weil der Link-Text "Reviews" ist ?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Dein gesuchter Code:
    $content = <<< EOF
    <p>... <a href="reviews/aaa.php">AAA</a> ... <a href="reviews/aaa.php">Reviews</a> ... </p>
    <p>... <a href="reviews/bbb.php">BBB</a> ... <a href="reviews/bbb.php">Reviews</a> ... </p>
    <p>... <a href="reviews/ccc.php">CCC</a> ... <a href="reviews/ccc.php">Reviews</a> ... </p>
    EOF;
    
    $pattern = '#<a[^>]+href\=([\'"])reviews/(.*)\1[^>]*>(?(?!reviews)(.*))</a>#Umsi';
    preg_match_all($pattern, $content, $matches); 
     
    print_r($matches);
    Im Array
    $matches[3]
    hast du den gesuchten Text.
  4. Autor dieses Themas

    grgiko

    grgiko hat kostenlosen Webspace.

    hmmm. leider nicht ganz
    mit Deinem Pattern bekomme ich immer HTML im Ergebnis,
    ausser in $matches[3], aber da dann nur den Linktext
    ich will doch aber sowohl die URLs und je Linktext dazu (einzeln)


    mit meinem ursprünglichen Pattern bekomme ich in $matches
    ... hier ohne PREG_SET_ORDER als flag
    Array
    (
        [0] => Array
            (
                [0] => <a href="reviews/aaa.php">AAA</a>
                [1] => <a href="reviews/aaa.php">Reviews</a>
                [2] => <a href="reviews/bbb.php">BBB</a>
                [3] => <a href="reviews/bbb.php">Reviews</a>
                [4] => <a href="reviews/ccc.php">CCC</a>
                [5] => <a href="reviews/ccc.php">Reviews</a>
            )
    
        [1] => Array
            (
                [0] => aaa.php
                [1] => aaa.php
                [2] => bbb.php
                [3] => bbb.php
                [4] => ccc.php
                [5] => ccc.php
            )
    
        [2] => Array
            (
                [0] => AAA
                [1] => Reviews
                [2] => BBB
                [3] => Reviews
                [4] => CCC
                [5] => Reviews
            )
    
    )


    also alle Links doppelt


    jetzt - mit Deinem Pattern - bekomme ich in $matches

    Array
    (
        [0] => Array
            (
                [0] => <a href="reviews/aaa.php">AAA</a>
                [1] => <a href="reviews/aaa.php">Reviews</a> ... </p>
    <p>... <a href="reviews/bbb.php">BBB</a>
                [2] => <a href="reviews/bbb.php">Reviews</a> ... </p>
    <p>... <a href="reviews/ccc.php">CCC</a>
            )
    
        [1] => Array
            (
                [0] => "
                [1] => "
                [2] => "
            )
    
        [2] => Array
            (
                [0] => aaa.php
                [1] => aaa.php">Reviews</a> ... </p>
    <p>... <a href=
                [2] => bbb.php">Reviews</a> ... </p>
    <p>... <a href=
            )
    
        [3] => Array
            (
                [0] => AAA
                [1] => BBB
                [2] => CCC
            )
    
    )



    also in [0], [1] und [2] ganz komisch mal mit und mal ohne umschließenden <p> Tag ?!?
    ??? warum auch immer :confused:

    Mein Wunsch-Ergebnis ist

    [1] => Array
            (
                [0] => aaa.php
                [1] => bbb.php
                [2] => ccc.php
            )
    
    [2] => Array
            (
                [0] => AAA
                [1] => BBB
                [2] => CCC
            )


    wobei es egal ist, in welcher Ebene von $matches
    (und egal ob PREG_SET_ORDER oder einzelne Arrays)
    hauptsache die URLs und Linktexte, außer bei Linktext = "Reviews"



    PS: ich hatte noch die Idee, meinen ersten Pattern zu nehmen,
    und dann einfach array_unique auf $matches[1] anwenden
    dann bekomme ich auch nur "einmal" die Links (URLs)

    also so ...(mit meinem Pattern und preg_match_all ohne PREG_SET_ORDER als flag)


    $resul = array(); 
    
    $result_urls = array_unique($matches[1]); 
    
    $result['url'] = array_merge($result_urls); 
    
    $result['txt'] = array(); 
    foreach($matches[2] as $linktext) { 
      if ($linktext != 'Reviews') {$result['txt'][] = $linktext; } 
    } 
    
    print "<pre>\n"; 
    print_r($result);
    print "</pre>\n";


    keine Anhnung was jetzt besser ist (Ressourcen schonender)
    gleich den "richtigen" Pattern (der noch nicht gefunden ist)
    oder die Nachbearbeitung mit array_unique etc.


    Beitrag zuletzt geändert: 10.6.2012 15:57:26 von grgiko
  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Eventuell so?
    $content = <<< EOF
    <p>... <a href="reviews/aaa.php">AAA</a> ... <a href="reviews/aaa.php">Reviews</a> ... </p>
    <p>... <a href="reviews/bbb.php">BBB</a> ... <a href="reviews/bbb.php">Reviews</a> ... </p>
    <p>... <a href="reviews/ccc.php">CCC</a> ... <a href="reviews/ccc.php">Reviews</a> ... </p>
    EOF;
    
    $pattern = '#<a[^>]+href\=([\'"])reviews/(.*)\1[^>]*>(?:reviews|(.*))</a>#Usi';
    preg_match_all($pattern, $content, $matches); 
     
    print_r($matches);
    Das Ergebnis:
    Array
    (
        [0] => Array
            (
                [0] => <a href="reviews/aaa.php">AAA</a>
                [1] => <a href="reviews/aaa.php">Reviews</a>
                [2] => <a href="reviews/bbb.php">BBB</a>
                [3] => <a href="reviews/bbb.php">Reviews</a>
                [4] => <a href="reviews/ccc.php">CCC</a>
                [5] => <a href="reviews/ccc.php">Reviews</a>
            )
    
        [1] => Array
            (
                [0] => "
                [1] => "
                [2] => "
                [3] => "
                [4] => "
                [5] => "
            )
    
        [2] => Array
            (
                [0] => aaa.php
                [1] => aaa.php
                [2] => bbb.php
                [3] => bbb.php
                [4] => ccc.php
                [5] => ccc.php
            )
    
        [3] => Array
            (
                [0] => AAA
                [1] => 
                [2] => BBB
                [3] => 
                [4] => CCC
                [5] => 
            )
    
    )
  6. Autor dieses Themas

    grgiko

    grgiko hat kostenlosen Webspace.

    ja, schon besser :)

    aber da sind immernoch die unerwünschten Links im Ergebnis
    und anstatt Linktext = "Reviews" ist jetzt halt Leerstring als Linktext in $matches[3]

    also muss ich damit auch wieder "nachbearbeiten"
    und prüfen ob Elemente in $matches[3] != '' (Leerstring) bzw. mit !empty()


    z.B. irgendwie so ... entweder if (!empty($linktext)) oder if ($linktext != "")
    $ergebnis = array(); 
    
    $i=0; 
    foreach($matches[3] as $linktext) { 
       if (!empty($linktext))   // --- oder mit: if ($linktext != "") 
       { 
       $ergebnis[] = array($matches[2][$i], $matches[3][$i]); 
       }
    $i++;
    }


    kommt quasi auf's selbe raus
    ob ich prüfe, das kein "" (Leerstring) oder kein 'Reviews' vorkommt


    habe gehofft, ich kann direkt mit dem Pattern zum Ergebnis kommen,
    also gleich im $matches nur je die 3 Links, und nicht alle 6 (aus Beispiel)
    damit ich nicht nochmal Prüfung in Nachbearbeitung machen muss

    geht ja leider nicht so, das die (ganze) Regex Bedingung nicht erfüllt ist,
    wenn das böse Wort "reviews" (Groß- oder Kleinschreibung egal) darin vorkommt,
    denn auch bei gewünschten Links ist "reviews" ja Teil der URL,
    nur im Linktext darf es nicht vorkommen, aber nicht "generell nicht" ...

    naja, ist ok, mit der Nachbearbeitung kann ich schon leben, so geht's ja
    wäre halt nur "schöner" (und schlanker) wenn direkt mit Regex Pattern
    das würde den foreach-Durchlauf (Prüfung und neues Ergebnis bauen) ersparen
    ... aber bei ca. 10 Links pro Aufruf ist das auch nicht soooo ein großes Problem

    Danke !

  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!