2009-07-24 7 views
1

Je veux demander quelle pourrait être l'erreur que je fais dans ce code. J'essaye actuellement de trouver la première occurrence d'une étiquette d'image ou d'une étiquette d'objet puis de retourner un morceau de html s'il correspond à un. Actuellement, je peux obtenir l'étiquette de l'image, mais malheureusement, je ne peux pas avoir de résultats sur l'étiquette de l'objet.Php: Trouver le premier img ou tag d'objet dans la chaîne

Je pense, je fais une erreur dans mon modèle regex ou quelque chose. L'exigence d'espoir est assez claire pour que vous compreniez merci.

Mon code ici:

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; 
    } 

Répondre

2

Essayez ceci: (Vous devez définir ce que vous voulez obtenir dans le tableau matchs)

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

Eh bien, je suis actuellement en train d'essayer de faire de la fonction aussi rechercher des balises d'objets ... – user143805

+0

Ah ... Impossible de voir cela en raison des barres de défilement. Intéressant ... –

+0

Vous ne définissez jamais ce que vous voulez récupérer. Vous devez placer '(' ') autour de ce que vous voulez dans le tableau de correspondance. –

3

Alors que les expressions régulières peuvent être bon pour une grande variété des tâches, je trouve qu'il est généralement court lors de l'analyse HTML DOM. Le problème avec le HTML est que la structure de votre document est tellement variable qu'il est difficile d'en extraire avec précision une précision (et je veux dire 100% de taux de réussite sans faux positif).

Ce que je vous recommande de faire est d'utiliser un analyseur DOM tels que SimpleHTML et l'utiliser comme tel:

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>'; 
} 

Certains peuvent penser que cela est exagéré, mais à la fin, il sera plus facile de maintenir et aussi permet plus d'extensibilité. Par exemple, en utilisant l'analyseur DOM, je peux ajouter aux styles de votre image actuelle. Une expression régulière pourrait être conçue pour atteindre le même but, mais serait limitée de telle sorte qu'elle forcerait l'attribut style à être après le src ou le contraire, et surmonter cette limitation ajouterait plus de complexité à la normale. expression.

Considérez également ce qui suit. Pour correspondre correctement une étiquette <img> utilisant des expressions régulières et pour obtenir que l'attribut src (capturé dans le groupe 2), vous devez l'expression régulière suivante:

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

Et là encore, le dessus peut échouer si:

  • L'attribut ou le nom de tag est en majuscule et le modificateur i n'est pas utilisé.
  • Les guillemets ne sont pas utilisés autour de l'attribut src.
  • Un autre attribut que src utilise le caractère > quelque part dans leur valeur.
  • Une autre raison que je n'ai pas prévue.

Encore une fois, n'utilisez simplement pas d'expressions régulières pour analyser un document dom.

Questions connexes