kostenloser Webspace werbefrei: lima-city


text zwischen zwei markern auslesen ?

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    i******g

    Hallo

    ich möchte aus einem tag/string">String den Text zwischen zwei Markierungen auslesen

    wenn String <noscript> enthält, dann alle zwischen <noscript> und </noscript> in die Variable übergeben

    leider klappt es so nicht: (hab ich mir aus dem php.net Manual zusammen-gewurschtelt)

    if ( preg_match('@^(?<noscript>)?([^</noscript>]+)@i', $myCode, $treffer)) { 
      $myCode = $treffer[1];
      }


    jetzt hab ich auch gelesen, das ginge evtl. auch direkt mit preg_replace
    aber wie?

    edit: auch damit klappts leider (noch) nicht ???


    $myCode = "blablabla<noscript>das hier will ich haben</noscript>blablabla"; 
    
    $pattern = '/^<noscript>(?P<htmlcode>\d+)</noscript>$/';
      preg_match($pattern, $myCode, $matches);
      if ( !empty($matches['htmlcode']) ) { $myCode = $matches['htmlcode']; }


    was ist falsch?


    Beitrag zuletzt geändert: 16.4.2011 13:47:05 von ikatalog
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

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

  3. Viele Wege führen nach Rom. Hier sind drei:

    <?php
    $myCode = 'blablabla<noscript>das hier will ich haben</noscript>blablabla';
    
    // 1. Methode
    $pattern = '/<noscript>(.*?)<\/noscript>/';
    preg_match($pattern, $myCode, $matches);
    echo $matches[1];
    
    //--
    echo '<br />';
    //--
    
    // 2. Methode
    $tags = array();
    $dom = new DOMDocument;
    @$dom->loadHTML($myCode);
    
    $tags = $dom->getElementsByTagName('noscript');
     
    foreach ($tags as $tag){
    	echo $tag->nodeValue;
    }
    
    //--
    echo '<br />';
    //--
    
    // 3. Methode
    $text = explode('<noscript>', $myCode);
    $text = explode('</noscript>', $text[1]);
    echo $text[0];
    ?>


    Beitrag zuletzt geändert: 16.4.2011 14:17:10 von fabo
  4. Autor dieses Themas

    i******g

    vielen Dank !!!

    (dumme) Frage: wie bitte soll man darauf kommen, dass bei methode1 mit <\/noscript> ein Backslash rein kommt ?!?
    naja, ist halt wohl einfach so :-)

    methode 2 ist auch interessant, methode3 wohl eher eine Not-Lösung

    welche der 3 methoden braucht wohl am wenigsten performance? ... ich schätze mal die methode1, oder?
  5. Naja...

    $pattern = "|<noscript>(.*?)</noscript>|";


    würde auch funktionieren ;)

    Zu deiner Frage... Das lässt sich schwer sagen (dafür aber herausfinden). Ich tendiere zu Methode 3, wobei die anderen beiden Methoden einfach schicker sind.

    explode ist aber definitiv nichts für große Strings.

    Beitrag zuletzt geändert: 16.4.2011 14:38:07 von fabo
  6. Hallo,

    wie fabo schon sagte, wenn nur eine noscript-Sektion vorkommt, dann ist die 3. Methode am schnellsten.
    Ansonsten ist die RegExp-Variante (Methode 1) am besten, weil dabei weniger Speicher verbraucht wird und eine gescriptete Lösung mit einer for-Schleife bei den Scriptsprachen PHP und Perl nicht an die Performance der modernen RegExp-Maschienen rankommt.

    Allerdings ist ein RegExp auch mit Vorsicht zu genießen, wenn er zu umfangreich wird, dann sinkt die Performance drastisch, weshalb man dann eine einfache Vorabselektierung vornehmen sollte, dies ist hier aber nicht der Fall.

    Um zu sehen wie extrem der Unterschied zwischen den RegExp-Methoden und einer Scriptlösung ist, kannst du dir ja mal einen kleinen Vergleich ansehen, den ich mal aus Spaß zu einem Forenbeitrag hier gemacht habe:
    http://www.lima-city.de/thread/8-1-2011-regex-problem/page%3A0/perpage%3A30#962599

    Außerdem muss bei der ersten Lösung ein Backslash rein, um den darauffolgenden Slash zu maskieren, das ist nötig, da der Reguläre Ausdruck in diesem Beispiel mit einem Slash "begrenzt" sprich begonnen und beendet wird.
    Beispiel:
    Wir wollen das vorkommen foo/bar finden,
    dazu vergleichen wir einige Reguläre Ausdrücke:
    /foo/bar/ => der Ausdruck der gesucht wird ist "foo", außerdem wird ein 
        Fehler geworfen, weil die Modifier "b" "a" und "r" nicht bekannt sind
    /foo\/bar/ => der Ausdruck der gesucht wird ist "foo/bar"
    @foo/bar@ => der Ausdruck der gesucht wird ist "foo/bar"
    @foo\/bar@ => der Ausdruck der gesucht wird ist "foo/bar"

    Alle Links die du brauchst um das ganze nachzulesen sind hier:
    http://de.php.net/manual/de/reference.pcre.pattern.modifiers.php
    http://de.php.net/manual/de/regexp.reference.escape.php
    http://de.php.net/manual/de/regexp.reference.delimiters.php

    Und zusätzliches zur Performance
    http://de.php.net/manual/de/regexp.reference.performance.php

    Mit freundlichen Grüßen
  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!