2009-07-24 7 views
1

Ich möchte fragen, was könnte der Fehler sein, den ich in diesem Code mache. Ich versuche gerade das erste Vorkommen eines Bild-Tags oder eines Objekt-Tags zu finden und gebe dann ein Stück html zurück, wenn es einem entspricht. Derzeit kann ich das Bild-Tag bekommen, aber leider kann ich keine Ergebnisse auf Objekt-Tags haben.Php: Finden Sie zuerst img oder Objekt-Tag in String

Ich dachte, ich mache einen Fehler in meinem Regex-Muster oder so. Hoffnung Anforderung ist klar genug für Sie zu verstehen, danke.

Mein Code hier:

function get_first_image(){ 
     global $post, $posts; 
     $first_img = ''; 
     ob_start(); 
     ob_end_clean(); 
     $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches) || preg_match_all('/<object[0-9 a-z_?*=\":\-\/\.#\,<>\\n\\r\\t]+<\/object>/smi', $post->post_content, $matches); 
     $first_img = $matches [1] [0]; 

     if(empty($first_img)){ //Defines a default image 
     $mediaSearch = preg_match_all('/<object[0-9 a-z_?*=\":\-\/\.#\,<>\\n\\r\\t]+<\/object>/smi', $post->post_content, $matches2); 
     $first_media = $matches2 [1] [0]; 
     $first_img = "/images/default.jpg"; 
     } 

     if(!empty($first_img)){ 
     $result = "<div class=\"alignleft\"><img src=\"$first_img\" style=\"max-width: 200px;\" /></div>"; 
     } 

     if(!empty($first_media)){ 
     $result = "<p>" . $first_media . "</p>"; 
     } 

     return $result; 
    } 

Antwort

2

Versuchen Sie folgendes: (Sie müssen definieren, was Sie in den Spielen Array erhalten möchten)

function get_first_image(){ 
     global $post, $posts; 
     $first_img = ''; 
     ob_start(); 
     ob_end_clean(); 
     $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches) || preg_match_all('(/<object[0-9 a-z_?*=\":\-\/\.#\,<>\\n\\r\\t]+<\/object>)/smi', $post->post_content, $matches); 
     $first_img = $matches [1] [0]; 

     if(empty($first_img)){ //Defines a default image 
     $mediaSearch = preg_match_all('/<object[0-9 a-z_?*=\":\-\/\.#\,<>\\n\\r\\t]+<\/object>/smi', $post->post_content, $matches2); 
     $first_media = $matches2 [1] [0]; 
     $first_img = "/images/default.jpg"; 
     } 

     if(!empty($first_img)){ 
     $result = "<div class=\"alignleft\"><img src=\"$first_img\" style=\"max-width: 200px;\" /></div>"; 
     } 

     if(!empty($first_media)){ 
     $result = "<p>" . $first_media . "</p>"; 
     } 

     return $result; 
    } 
+0

Nun, ich versuche gerade, die Funktion auch für Objekte Tags suchen ... – user143805

+0

Ah ... Konnte nicht wegen der Bildlaufleisten sehen. Interessant ... –

+0

Sie definieren nie, was Sie zurückbekommen möchten. Sie müssen '(' ') um das, was Sie wollen, in das Match-Array einfügen. –

3

Während reguläre Ausdrücke für eine große Vielfalt gut sein kann von Aufgaben, finde ich es in der Regel bei der Analyse von HTML-DOM zu kurz. Das Problem mit HTML ist, dass die Struktur Ihres Dokuments so variabel ist, dass es schwierig ist, genau (und genau genommen 100% Erfolgsrate ohne falsches Positiv) ein Tag zu extrahieren.

Was ich empfehlen Sie tun, ist ein DOM-Parser wie SimpleHTML verwenden und sie als solche verwendet werden:

function get_first_image(){ 
    global $post, $posts; 

    require_once('SimpleHTML.class.php') 

    $post_dom = str_get_dom($post->post_content); 

    $first_img = $post_dom->find('img', 0); 

    if($first_img !== null) { 
     $first_img->style = $first_img->style . ';max-width: 200px'; 
     return '<div class="alignleft">' . $first_img->outertext . '</div>'; 
    } else { 
     $first_obj = $post_dom->find('object', 0); 

     if($first_obj !== null) { 
      return '<p>' . $first_obj->outertext . '</p>'; 
     } 
    } 

    return '<div class="alignleft"><img src="/images/default.jpg" style="max-width: 200px;" /></div>'; 
} 

Einige mögen denken, dies übertrieben ist, aber am Ende wird es leichter sein, zu pflegen und auch ermöglicht mehr Erweiterbarkeit. Mit dem DOM-Parser kann ich beispielsweise die Stile Ihres aktuellen Bildes hinzufügen.

Ein regulärer Ausdruck könnte entwickelt werden, um das gleiche Ziel zu erreichen, wäre aber so begrenzt, dass er das style Attribut nach dem src oder das Gegenteil zwingen würde, und diese Beschränkung würde dem Regelmäßigen mehr Komplexität hinzufügen Ausdruck.

Beachten Sie auch Folgendes. Um richtig ein <img> Tag mit regulären Ausdrücken übereinstimmen und nur das src Attribut (gefangen in der Gruppe 2) zu erhalten, können Sie den folgenden regulären Ausdruck benötigen:

<\s*?img\s+?[^>]*?\s*?src\s*?=\s*?(["'])((\\?+.)*?)\1[^>]*?> 

Und dann wieder, kann die oben fehlschlagen, wenn:

  • Der Attribut- oder Tag-Name ist in Großbuchstaben und der i Modifikator wird nicht verwendet.
  • Für das Attribut src werden keine Kurse verwendet.
  • Ein anderes Attribut dann src verwendet das > Zeichen irgendwo in ihrem Wert.
  • Ein anderer Grund habe ich nicht vorausgesehen.

Also noch einmal, verwenden Sie keine regulären Ausdrücke, um ein dom Dokument zu analysieren.