2016-05-13 3 views
0

Auf meinem Code ich die follwoing regexp haben:PHP erhalten die <h[1-6]></h[1-6]> Werte aus einer HTML-Text

preg_match_all('/<title>([^>]*)<\/title>/si', $contents, $match); 

, dass die <h>..</h>-Tags aus einer Webseite abruft. Aber manchmal kann es HTML-Tags haben wie <strong>, <b> etc etc daher einige Modifikationen Es braucht daher habe ich versucht, diesen einen

preg_match_all('/<h[1-6]>(.*)<\/h[1-6]>/si', $contents, $match); 

aber etwas falsch und abrufen nicht die Inhalte, die in HTML ist <h> Tags.

Können Sie mir helfen, die Regexp korrekt zu ändern?

+7

[Ihr versucht haben, einen DOM-Parser verwenden?] (http://stackoverflow.com/a/1732454/511529) – GolezTrol

+4

Wenn die 'h's irgendwelche Attribute haben, wird dies fehlschlagen. '. *' ist auch gierig, wenn Sie mehr als einen auf der Seite haben, wird es alles essen. Parser ist Ihre beste Vorgehensweise. Werfen Sie einen Blick auf http://stackoverflow.com/questions/3577641/how-do-you-parse-and-process-html-xml-in-php – chris85

+1

Wie es in diesem anderen Beitrag sagt, verwenden Sie Regex nicht parsen Sie HTML, es sei denn, Ihr HTML ist tot einfach und Sie müssen nicht nach verschachtelten Tags suchen. Selbst dann, schlechte Idee. Es gibt DOM-Parser ([DOMDocument] (https://php.net/domdocument)), die zum Parsen von HTML gemacht werden und mit denen man recht einfach arbeiten kann. Sie haben mehrere der gleichen Methoden wie "getElementsByTagName", mit denen man jedes '' -Tag finden kann. –

Antwort

1
preg_match_all('<h\d>', $contents, $matches); 

foreach($matches as $match){ 
$num[] = substr ($match , 1 , 1); 
} 
0

Wenn Gebrauch (.*) Sie alles nehmen, denn nur Worte, Ziffern und Raum, vielleicht können Sie mit ihnen eine Reihe verwenden und nehmen Sie ein oder mehr:

preg_match_all('/<h[1-6]>([\w\d\s]+)<\/h[1-6]>/si', $contents, $match); 
0

Jetzt ist hier, kein Regex Experte, aber soll er sein in deinen Schuhen; Er würde es tun, wie so:

<?php 

     // SIMULATED SAMPLE HTML CONENT - WITH ATTRIBUTES: 
     $contents = '<section id="id-1">And even when darkness covers your path and no one is there to lend a hand; 
      <h3 class="class-1">Always remember that <em>There is always light at the end of the Tunnel <span class="class-2">if you can but hang on to your Faith!</span></em></h3> 
      <div>Now; let no one deceive you: <h2 class="class-2">You will be tried in ever ways - sometimes beyond your limits...</h2></div> 
      <article>But hang on because You are the Voice... You are the Light and you shall rule your Destiny because it is all about<h6 class="class4">YOU - THE REAL YOU!!!</h6></article> 
      </section>'; 

     // SPLIT THE CONTENT AT THE END OF EACH <h[1-6]> TAGS 
     $parts  = preg_split("%<\/h[1-6]>%si", $contents); 
     $matches = array(); 

     // LOOP THROUGH $parts AND BUNDLE APPROPRIATE ELEMENTS TO THE $matches ARRAY.  
     foreach($parts as $part){ 
      if(preg_match("%(.*|.?)(<h)([1-6])%si", $part)){ 
       $matches[] = preg_replace("%(.*|.?)(<)(h[1-6])(.*)%si", "$2$3$4$2/$3>", $part); 
      } 
     } 
     var_dump($matches); 


     //DUMPS:::: 
     array (size=3) 
      0 => string '<h3 class="class-1">Always remember that <em>There is always light at the end of the Tunnel <span class="class-2">if you can but hang on to your Faith!</span></em></h3>' (length=168) 
      1 => string '<h2 class="class-2">You will be tried in ever ways - sometimes beyond your limits...</h2>' (length=89) 
      2 => string '<h6 class="class4">YOU - THE REAL YOU!!!</h6>' (length=45) 

als Funktion, das ist, was es auf kocht:

<?php 

     function pseudoMatchHTags($htmlContentWithHTags){ 
      $parts  = preg_split("%<\/h[1-6]>%si", $htmlContentWithHTags); 
      $matches = array(); 
      foreach($parts as $part){ 
       if(preg_match("%(.*|.?)(<h)([1-6])%si", $part)){ 
        $matches[] = preg_replace("%(.*|.?)(<)(h[1-6])(.*)%si", "$2$3$4$2/$3>", $part); 
       } 
      } 
      return $matches; 
     } 

     var_dump(pseudoMatchHTags($contents)); 

Sie können es hier testen: https://eval.in/571312 ... vielleicht hilft es ein Bit ... ich hoffe ... ;-)